sql >> Databasteknik >  >> NoSQL >> Redis

Använd flera DB:er med ett Redis Lua-skript?

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.




  1. Rescue :Anslutning nekad - Det går inte att ansluta till Redis på localhost:6379

  2. Rita namn på stater på kartan med Node js och D3 i realtid

  3. Gruppera efter specifikt element av array med mongo-aggregationsramverk

  4. Mongoose att ta bort (dra) ett dokument inom en array, fungerar inte med ObjectID