Quelle: Geyer
Redis Streams 21.03.2019, 07:58 Uhr

Interessante Eigenschaften

Das Multitalent Redis kommt mit Streams, die sich für vielfältige Aufgaben eignen.
In der neuesten Version stellt Redis neben anderen Features auch Streams bereit. Diese weisen einige interessante Eigenschaften auf, was sie für bestimmte Anwendungsfälle prädestiniert. Um die neuen Streams gleich praktisch aus einem eigenen Programm heraus ausprobieren zu können, greifen wir den Quellcode eines älteren Beitrages auf. Erwartungsgemäß findet sich der Quellcode zu diesem Artikel auch wieder im selben Github-Repository unter https://github.com/Jens-G/Redis-Samples, ebenso basieren im Folgenden alle Codeteile wiederum auf der verwendeten C#-Bibliothek StackExchange.Redis auf, weniger auf der darunterliegenden Abstraktionsebene nativer Redis-Kommandos. Für letztere sei auf die vorzügliche Online-Dokumentation verwiesen, die neben den Feinheiten jedes Befehles auch dessen Komplexität in der bekannten Big-O- beziehungsweise Landau-Notation aufzeigt:


// Stream Producer

private async Task CreateEvents( CancellationToken cancel)

{

  IDatabase db = OpenRedis();

 

  var rnd = new Random();

  var messung = rnd.Next(10000);

 

  while (!cancel.IsCancellationRequested)

  {

    // get current CPU load 

cpuCounter.NextValue();

    await Task.Delay(1000);

    var cpu = (int)cpuCounter.NextValue();

 

    // create entry data

    var data = new NameValueEntry[2] {

    new NameValueEntry("CPU", cpu.ToString()),

    new NameValueEntry("messung", ++messung)

    };

 

    // put entry into the stream

    var id = await db.StreamAddAsync(

    STREAM_NAME, data, null, 16, true);

  }

}

 

// Stream Consumer



private async Task ReceiveEvents( CancellationToken cancel)

{

  IDatabase db = OpenRedis();

 

  RedisValue? minID = null;

  while (!cancel.IsCancellationRequested)

  {

    // read next COUNT elements starting with minID

    const int COUNT = 10;

    var entries = await db.StreamRangeAsync(

        STREAM_NAME, minID, null, COUNT)

 

    var processed = 0;

    foreach (var entry in entries)

    {

      // extract and format the data

      var cpu = -1;

      var sb = new StringBuilder();

sb.AppendFormat("{0}:", entry.Id);

      foreach (var value in entry.Values)

      {

        sb.AppendFormat(" {0} = {1} ", value.Name, value.Value);

        if (value.Name.Equals("CPU"))

          cpu = int.Parse(value.Value); ;

      }

      // ... (hier Code für CPU-Grafik) ...

Console.WriteLine(sb.ToString());

 

      // increment minID to get the next entry

      minID = entry.Id + "1"; 

      ++processed;

    }

 

    // last loop delivered no data, so we trim the stream

    // we also wait a bit before we try again

    if (processed == 0)

    {

      await db.StreamTrimAsync(STREAM_NAME, 32);

      await Task.Delay(200);

    }

  }

 

}

 

//  Messdaten für Consumer-Groups



var messung = 0;

while (true)

{

cpuCounter.NextValue();

    Task.Delay(1000);

    var cpu = GetCurrentCPULoad();

 

    var data = new NameValueEntry[2] {

        new NameValueEntry("CPU", cpu.ToString()),

        new NameValueEntry("messung", ++messung)

    };

 

db.StreamAdd(STREAM_NAME, data, null, 16, true);

}

web & mobile DEVELOPER

Sie wollen zukünftig auch von den Vorteilen eines plus-Abos profitieren? Werden Sie jetzt web&mobile Developer plus Kunde.
  • 2 Monate Gratis testen
  • Über 4.000 qualifizierte Fachartikel
  • Diverse DevBooks thematisch für Sie zusammen gestellt
  • Webcasts von 30 - 90 Min.
  • Aufzeichnungen von ausgewählten Fortbildungen und Konferenzen
  • Auf jedem Gerät verfügbar