Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Verwenden Sie mehrere DBs mit einem Redis Lua-Skript?

Es ist normalerweise eine falsche Idee, verwandte Daten in verschiedenen Redis-Datenbanken abzulegen. Es gibt fast keinen Vorteil im Vergleich zur Definition von Namespaces durch Schlüsselbenennungskonventionen (keine zusätzliche Granularität in Bezug auf Sicherheit, Persistenz, Ablaufverwaltung usw.). Und ein großer Nachteil ist, dass die Clients die Auswahl der richtigen Datenbank manuell vornehmen müssen, was für Clients, die auf mehrere Datenbanken gleichzeitig abzielen, fehleranfällig ist.

Wenn Sie dennoch mehrere Datenbanken verwenden möchten, gibt es eine Möglichkeit, dies mit redis-py und Lua-Skripting zum Laufen zu bringen.

redis-py definiert keinen Wrapper für den SELECT-Befehl (der normalerweise verwendet wird, um die aktuelle Datenbank umzuschalten), aufgrund der zugrunde liegenden Thread-sicheren Verbindungspool-Implementierung. Aber nichts hindert Sie daran, SELECT von einem Lua-Skript aus aufzurufen.

Betrachten Sie das folgende Beispiel:

$ redis-cli
SELECT 0
SET mykey db0
SELECT 1
SET mykey db1

Das folgende Skript zeigt den Wert von mykey in den beiden Datenbanken derselben Client-Verbindung an.

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
r = redis.Redis(connection_pool=pool)

lua1 = """
   redis.call("select", ARGV[1])
   return redis.call("get",KEYS[1])
"""
script1 = r.register_script(lua1)

lua2 = """
   redis.call("select", ARGV[1])
   local ret = redis.call("get",KEYS[1])
   redis.call("select", ARGV[2])
   return ret
"""
script2 = r.register_script(lua2)

print r.get("mykey")
print script2( keys=["mykey"], args = [1,0] )
print r.get("mykey"), "ok"
print
print r.get("mykey")
print script1( keys=["mykey"], args = [1] )
print r.get("mykey"), "misleading !!!"

Das Skript lua1 ist naiv:Es wählt nur eine bestimmte Datenbank aus, bevor es den Wert zurückgibt. Seine Verwendung ist irreführend, da sich nach seiner Ausführung die aktuelle Datenbank, die der Verbindung zugeordnet ist, geändert hat. Tu das nicht.

Skript lua2 ist viel besser. Es nimmt die Zieldatenbank und die aktuelle Datenbank als Parameter. Es stellt sicher, dass die aktuelle Datenbank vor dem Ende des Skripts reaktiviert wird, damit der nächste Befehl, der auf die Verbindung angewendet wird, immer noch in der richtigen Datenbank ausgeführt wird. Leider gibt es im Lua-Skript keinen Befehl, um die aktuelle Datenbank zu erraten, so der Client muss es systematisch bereitstellen. Bitte beachten Sie, dass das Lua-Skript die aktuelle Datenbank am Ende zurücksetzen muss, was auch immer passiert (auch im Falle eines vorherigen Fehlers), so dass komplexe Skripte umständlich und umständlich werden.