Det är vanligtvis en felaktig idé att placera relaterad data i olika Redis-databaser. Det finns nästan ingen fördel jämfört med att definiera namnutrymmen med nyckelnamnkonventioner (ingen extra granularitet när det gäller säkerhet, uthållighet, utgångshantering, etc ...). Och en stor nackdel är att klienterna måste hantera valet av rätt databas manuellt, vilket är felbenäget för klienter som riktar in sig på flera databaser samtidigt.
Nu, om du fortfarande vill använda flera databaser, finns det ett sätt att få det att fungera med redis-py och Lua-skript.
redis-py definierar inte ett omslag för SELECT-kommandot (används normalt för att byta den aktuella databasen), på grund av den underliggande trådsäkra anslutningspoolimplementeringen. Men ingenting hindrar dig från att anropa SELECT från ett Lua-skript.
Tänk på följande exempel:
$ redis-cli
SELECT 0
SET mykey db0
SELECT 1
SET mykey db1
Följande skript visar värdet på mykey i de två databaserna från samma klientanslutning.
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 !!!"
Skriptet lua1 är naivt:det väljer bara en given databas innan värdet returneras. Dess användning är missvisande, eftersom den aktuella databasen som är kopplad till anslutningen har ändrats efter att den har körts. Gör inte det här.
Script lua2 är mycket bättre. Den tar måldatabasen och den aktuella databasen som parametrar. Den ser till att den aktuella databasen återaktiveras före slutet av skriptet, så att nästa kommando som tillämpas på anslutningen fortfarande körs i rätt databas. Tyvärr finns det inget kommando för att gissa den aktuella databasen i Lua-skriptet, så klienten måste tillhandahålla det systematiskt. Observera att Lua-skriptet måste återställa den aktuella databasen i slutet vad som än händer (även vid tidigare fel), så det gör komplexa skript besvärliga och besvärliga.