Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Use vários bancos de dados com um script Redis Lua?


Geralmente, é uma ideia errada colocar dados relacionados em diferentes bancos de dados Redis. Quase não há benefício em relação à definição de namespaces por convenções de nomenclatura de chave (sem granularidade extra em relação à segurança, persistência, gerenciamento de expiração, etc ...). E uma grande desvantagem é que os clientes precisam manipular manualmente a seleção do banco de dados correto, o que é propenso a erros para clientes que visam vários bancos de dados ao mesmo tempo.

Agora, se você ainda quiser usar vários bancos de dados, existe uma maneira de fazê-lo funcionar com redis-py e scripts Lua.

redis-py não define um wrapper para o comando SELECT (normalmente usado para alternar o banco de dados atual), devido à implementação do pool de conexão thread-safe subjacente. Mas nada impede que você chame SELECT de um script Lua.

Considere o seguinte exemplo:
$ redis-cli
SELECT 0
SET mykey db0
SELECT 1
SET mykey db1

O script a seguir exibe o valor de mykey nos 2 bancos de dados da mesma conexão de cliente.
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 !!!"

O script lua1 é ingênuo:ele apenas seleciona um dado banco de dados antes de retornar o valor. Seu uso é enganoso, pois após sua execução, o banco de dados atual associado à conexão foi alterado. Não faça isso.

O script lua2 é muito melhor. Leva o banco de dados de destino e o banco de dados atual como parâmetros. Ele garante que o banco de dados atual seja reativado antes do final do script, para que o próximo comando aplicado na conexão ainda seja executado no banco de dados correto. tem que fornecê-lo sistematicamente. Observe que o script Lua deve redefinir o banco de dados atual no final, aconteça o que acontecer (mesmo no caso de um erro anterior), portanto, torna os scripts complexos complicados e desajeitados.