Sie erlernen zwei Methoden, mit denen Sie Daten speichern und abrufen können. Bei der Auswahl der für Ihre Anwendung am besten geeigneten Methode sollten Sie sich für die entscheiden, die Ihre Architektur ausgehend von Ihren Datenzugriffsmustern vereinfacht.

Zunächst müssen Sie sich jedoch vergewissern, dass Sie eine Verbindung zu Redis herstellen können.

Veranschlagte Zeit für dieses Modul: 60 Minuten



Zurück auf dem ElastiCache-Dashboard:

Schritt 4.1

(zum Vergrößern klicken)

Schritt 4.1
Schritt 4.2

(zum Vergrößern klicken)

Schritt 4.2

Der in den Beispielen genannte Endpunkt bezieht sich immer auf den Hostnamen Ihres Konfigurationsendpunkts.

Schritt 4.3

(zum Vergrößern klicken)

Schritt 4.3

syntax: shell

$ python

Wenn die Befehle nicht ausgeführt werden, beachten Sie den Hinweis unter dem Beispiel. 

syntax: python

syntax: python
>>> import redis
>>> client = redis.Redis.from_url('redis://endpoint:6379')
>>> client.ping()

True

Hinweis: Wenn der Befehle nicht ausgeführt wird, wird der Prozess aufgrund der Einstellungen der Sicherheitsgruppe blockiert. Überprüfen Sie, ob Ihre EC2-Instance auf die Sicherheitsgruppe zugreifen kann, die Ihrer ElastiCache-Instance zugewiesen ist. Beispiel: Angenommen, Ihre EC2-Instance wurde der Standard-Sicherheitsgruppe zugewiesen. Sie können nun die Einstellungen für die Sicherheitsgruppe Ihrer Amazon ElastiCache-Instance anpassen und eine benutzerdefinierte TCP-Regel hinzufügen, mit der Verbindungen von jeder Instance in der Standard-Sicherheitsgruppe über Port 6379 zugelassen werden.

In Source können Sie dazu den Namen der Sicherheitsgruppe eingeben und anschließend auf die ID der betreffenden Sicherheitsgruppe klicken. Weitere Informationen zu Sicherheitsgruppen finden Sie in der Dokumentation oder im Referenzleitfaden für Sicherheitsgruppenregeln.

Schritt 4.5

(zum Vergrößern klicken)

Schritt 4.5

Im Repository finden Sie Python-Code, den Sie in Ihrer EC2-Instance ausführen können. Zunächst müssen Sie jedoch verschiedene Variablen Ihrer Umgebung konfigurieren:

syntax: shell

$ export REDIS_URL=redis://your_redis_endpoint:6379/
$ export DB_HOST=your_mysql_endpoint
$ export DB_USER=admin
$ export DB_PASS=your_admin_password
$ export DB_NAME=tutorial

Beachten Sie, dass die Werte für "mysql_endpoint", "redis_endpoint" und "password" denen entsprechen, die Sie in den vorherigen Schritten gespeichert haben.


Bei der ersten der beiden Methoden, die in dem Codebeispiel gezeigt werden, wird eine serialisierte Darstellung des Ergebnisses der SQL-Abfrage zwischengespeichert. Die Logik ist im folgenden Python-Codeausschnitt dargestellt:

syntax: python

def fetch(sql):

  result = cache.get(sql)
  if result:
    return deserialize(result)
  else:
    result = db.query(sql)
    cache.setex(sql, ttl, serialize(result))
    return result

Zunächst wird die SQL-Anweisung als Schlüssel in Redis verwendet und der Cache wird nach einem Wert durchsucht. Wenn kein Wert vorhanden ist, wird die SQL-Anweisung zum Abfragen der Datenbank verwendet. Das Ergebnis der Datenbankabfrage wird in Redis gespeichert. Je nach Art der Anwendung muss für die Variable "ttl" (Gültigkeitsdauer) ein sinnvoller Wert festgelegt werden. Wenn die Gültigkeitsdauer abläuft, wird der Schlüssel von Redis entfernt und der zugewiesene Speicher freigegeben. Dieser Code ist im Repository dieses Tutorials verfügbar und kann von Ihnen unverändert ausgeführt werden. Sie können bei Bedarf jedoch an verschiedenen Stellen "print"-Anweisungen hinzufügen, um den Wert einer Variable zu einem bestimmten Zeitpunkt anzuzeigen.

Aus strategischer Sicht besteht der Nachteil dieser Methode darin, dass Änderungen an Daten in der Datenbank dem Benutzer nicht automatisch angezeigt werden, wenn ein vorheriges Ergebnis zwischengespeichert wurde und die Gültigkeitsdauer noch nicht abgelaufen ist.

Nachfolgend finden Sie ein Beispiel dafür, wie Sie die Abfragefunktion verwenden würden:

syntax: python

print(fetch("SELECT * FROM planet"))

Folgendes Ergebnis würde ausgegeben:

syntax: python

[{'id': 10, 'name': 'Mercury'},
 {'id': 11, 'name': 'Venus'},
 {'id': 12, 'name': 'Earth'},
 {'id': 13, 'name': 'Mars'},
 {'id': 14, 'name': 'Jupiter'},
 {'id': 15, 'name': 'Saturn'},
 {'id': 16, 'name': 'Uranus'},
 {'id': 17, 'name': 'Neptune'}]

Selbstverständlich handelt es sich hierbei um ein stark vereinfachtes Beispiel. Die Implementierung dieses Caching-Musters bietet jedoch signifikante Vorteile für Ihre Anwendung, weil nicht zwischen Ergebnissen aus dem Cache und denen unterschieden wird, die direkt aus der Datenbank stammen.


Bei der zweiten Methode, die Sie implementieren werden, wird ein Eintrag in der Datenbank einem Redis-Hash-Wert zugeordnet:

syntax: python

def planet(id):

  key = "planet:" + str(id)
  result = cache.hgetall(key)

  if result:
      return result

  else:
      sql = "SELECT `id`, `name` FROM `planet` WHERE `id`=%s"
      result = db_record(sql, (id,))

      if result:
          cache.hmset(key, result)
          cache.expire(key, ttl)
      return result

Der in Redis verwendete Schlüsselbereich ist zwar strukturlos, allerdings gibt es eine Konvention zum Simulieren einer Struktur mithilfe von durch Doppelpunkt getrennten Zeichenfolgen. In diesem Beispiel wird der Schlüssel für den Eintrag mit der ID 1 dem Wert "planet:1" zugeordnet. Dieser Codeausschnitt eignet sich zwar hervorragend, um das zugrunde liegende Muster zu erläutern, jedoch ist eine umfassendere Abstrahierung möglich: So könnte ein Modul zum Generieren der Schlüssel und ein anderes Modul zum Erstellen der SQL-Zeichenfolge verwendet werden usw. Darüber hinaus gibt es sehr wahrscheinlich Tools, die eigens für diesen Zweck in der von Ihnen verwendeten Programmiersprache entwickelt wurden.
Mit dem Code in diesem Beispiel werden Einträge entweder aus dem Cache oder direkt aus der Datenbank abgerufen. Auf ähnliche Weise könnte eine Funktion erstellt werden, mit der ein Objekt dauerhaft in der Datenbank gespeichert wird.


In den obigen beiden Beispielen wurde die Gültigkeitsdauer (ttl, Time to Live) verwendet, nach deren Ablauf der Schlüssel von Redis entfernt wird. Diese Vorgehensweise eignet sich für die meisten Anwendungsfälle. Möglicherweise müssen Sie veraltete Daten jedoch so schnell wie möglich aus dem Cache entfernen. In diesem Fall sollten Sie andere Optionen in Erwägung ziehen, wie z. B. eine Write-Through-Caching-Strategie. Am Ende dieses Tutorials finden Sie Links mit weiteren Informationen. An dieser Stelle sei noch erwähnt, dass Redis zusätzlich zu dem in den Beispielen verwendeten "EXPIRE"-Befehl auch den Befehl "EXPIREAT" unterstützt. Mit diesem können Sie ein konkretes Datum und die Uhrzeit für die Löschung eines Schlüssels festlegen. Als Parameter wird ein absoluter Unix-Zeitstempel verwendet (d. h. Sekunden, die seit dem 1. Januar 1970 vergangen sind).


Wenn die Menge an Daten den für den Speicher festgelegten Höchstwert überschreitet, werden von Redis je nach der ausgewählten Bereinigungsrichtlinie unterschiedliche Maßnahmen ergriffen. ElastiCache für Redis ist standardmäßig so konfiguriert, dass die am längsten nicht verwendeten Schlüssel mit einer festgelegten Gültigkeitsdauer aus dem Speicher entfernt werden. Der Parameter für die Bereinigungsrichtlinie lautet "maxmemory-policy" und der Standardwert in ElastiCache "vilatile-lru". Eine weitere interessante Möglichkeit für diesen Anwendungsfall ist die Richtlinie "volatile-ttl, mit der in Redis Speicherplatz freigegeben wird, indem die Schlüssel mit dem kürzesten Gültigkeitsdauer entfernt werden.


Nachdem Sie diese Strategie umgesetzt haben, müssen Sie Ihre Anwendung testen, um den optimalen Wert für die Gültigkeitsdauer und die für Ihre Zwecke am besten geeignete Bereinigungsstrategie zu ermitteln. Überprüfen Sie die Leistung Ihrer Anwendung mit leerem und vollem Cache.