sql >> Database >  >> NoSQL >> Redis

Meerdere DB's gebruiken met één Redis Lua-script?

Het is meestal een verkeerd idee om gerelateerde gegevens in verschillende Redis-databases te plaatsen. Er is bijna geen voordeel vergeleken met het definiëren van naamruimten door middel van belangrijke naamgevingsconventies (geen extra granulariteit met betrekking tot beveiliging, persistentie, expiratiebeheer, enz ...). En een groot nadeel is dat de klanten de selectie van de juiste database handmatig moeten afhandelen, wat foutgevoelig is voor klanten die zich op meerdere databases tegelijkertijd richten.

Als je nu nog steeds meerdere databases wilt gebruiken, is er een manier om het te laten werken met redis-py en Lua-scripting.

redis-py definieert geen wrapper voor de SELECT-opdracht (normaal gebruikt om de huidige database te wisselen), vanwege de onderliggende thread-veilige verbindingspoolimplementatie. Maar niets weerhoudt je ervan om SELECT aan te roepen vanuit een Lua-script.

Beschouw het volgende voorbeeld:

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

Het volgende script toont de waarde van mykey in de 2 databases van dezelfde clientverbinding.

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

Script lua1 is naïef:het selecteert gewoon een bepaalde database voordat de waarde wordt geretourneerd. Het gebruik ervan is misleidend, omdat na de uitvoering de huidige database die aan de verbinding is gekoppeld, is gewijzigd. Doe dit niet.

Script lua2 is veel beter. Het neemt de doeldatabase en de huidige database als parameters. Het zorgt ervoor dat de huidige database opnieuw wordt geactiveerd voor het einde van het script, zodat het volgende commando dat op de verbinding wordt toegepast nog steeds in de juiste database wordt uitgevoerd. Helaas is er geen commando om de huidige database te raden in het Lua-script, dus de client moet dit systematisch verstrekken. Houd er rekening mee dat het Lua-script de huidige database aan het einde moet resetten, wat er ook gebeurt (zelfs in het geval van een eerdere fout), dus het maakt complexe scripts omslachtig en onhandig.




  1. 20 Opmerkelijk verschil tussen Hadoop 2.x versus Hadoop 3.x

  2. How-to:gebruik de HBase Thrift-interface, deel 2:rijen invoegen/krijgen

  3. Azure DataBricks Stream foreach mislukt met NotSerializableException

  4. Heroku Redis - GUI en geheugenoptimalisatie