Redis
 sql >> Database >  >> NoSQL >> Redis

Utilizzare più DB con uno script Redis Lua?

Di solito è un'idea sbagliata inserire i dati correlati in diversi database Redis. Non vi è quasi alcun vantaggio rispetto alla definizione di spazi dei nomi mediante convenzioni di denominazione delle chiavi (nessuna granularità aggiuntiva in merito a sicurezza, persistenza, gestione della scadenza, ecc ...). E uno dei principali svantaggi è che i client devono gestire manualmente la selezione del database corretto, il che è soggetto a errori per i client che prendono di mira più database contemporaneamente.

Ora, se vuoi ancora utilizzare più database, c'è un modo per farlo funzionare con redis-py e lo scripting Lua.

redis-py non definisce un wrapper per il comando SELECT (normalmente utilizzato per cambiare il database corrente), a causa dell'implementazione del pool di connessioni thread-safe sottostante. Ma nulla ti impedisce di chiamare SELECT da uno script Lua.

Considera il seguente esempio:

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

Lo script seguente mostra il valore di mykey nei 2 database della stessa connessione 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 !!!"

Lo script lua1 è ingenuo:seleziona semplicemente un determinato database prima di restituire il valore. Il suo utilizzo è fuorviante, perché dopo la sua esecuzione, il database corrente associato alla connessione è cambiato. Non farlo.

Lo script lua2 è molto meglio. Prende il database di destinazione e il database corrente come parametri. Si assicura che il database corrente venga riattivato prima della fine dello script, in modo che il comando successivo applicato sulla connessione venga ancora eseguito nel database corretto. Sfortunatamente, non esiste alcun comando per indovinare il database corrente nello script Lua, quindi il client deve provvedere sistematicamente. Tieni presente che lo script Lua deve reimpostare il database corrente alla fine qualunque cosa accada (anche in caso di errore precedente), quindi rende gli script complessi ingombranti e scomodi.