Redis
 sql >> Base de données >  >> NoSQL >> Redis

Utiliser plusieurs bases de données avec un seul script Redis Lua ?

C'est généralement une mauvaise idée de placer des données connexes dans différentes bases de données Redis. Il n'y a presque aucun avantage par rapport à la définition des espaces de noms par des conventions de nommage de clés (pas de granularité supplémentaire concernant la sécurité, la persistance, la gestion de l'expiration, etc ...). Et un inconvénient majeur est que les clients doivent gérer manuellement la sélection de la bonne base de données, ce qui est sujet aux erreurs pour les clients ciblant plusieurs bases de données en même temps.

Maintenant, si vous souhaitez toujours utiliser plusieurs bases de données, il existe un moyen de le faire fonctionner avec redis-py et les scripts Lua.

redis-py ne définit pas de wrapper pour la commande SELECT (normalement utilisée pour changer de base de données actuelle), en raison de l'implémentation sous-jacente du pool de connexions thread-safe. Mais rien ne vous empêche d'appeler SELECT depuis un script Lua.

Prenons l'exemple suivant :

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

Le script suivant affiche la valeur de mykey dans les 2 bases de données à partir de la même connexion client.

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 !!!"

Le script lua1 est naïf :il sélectionne simplement une base de données donnée avant de renvoyer la valeur. Son utilisation est trompeuse, car après son exécution, la base de données courante associée à la connexion a changé. Ne fais pas ça.

Le script lua2 est bien meilleur. Il prend la base de données cible et la base de données courante comme paramètres. Il s'assure que la base de données actuelle est réactivée avant la fin du script, de sorte que la prochaine commande appliquée à la connexion s'exécute toujours dans la bonne base de données. Malheureusement, il n'y a pas de commande pour deviner la base de données actuelle dans le script Lua, donc le client doit le fournir systématiquement. Veuillez noter que le script Lua doit réinitialiser la base de données actuelle à la fin quoi qu'il arrive (même en cas d'erreur précédente), ce qui rend les scripts complexes encombrants et maladroits.