sql >> Databáze >  >> NoSQL >> Redis

Použít více DB s jedním skriptem Redis Lua?

Vkládat související data do různých databází Redis je obvykle špatný nápad. Neexistuje téměř žádná výhoda ve srovnání s definováním jmenných prostorů pomocí konvencí pojmenovávání klíčů (žádná extra granularita týkající se bezpečnosti, perzistence, správy expirace atd...). A hlavní nevýhodou je, že klienti musí ručně zpracovávat výběr správné databáze, což je náchylné k chybám u klientů, kteří cílí na více databází současně.

Nyní, pokud stále chcete používat více databází, existuje způsob, jak zajistit, aby to fungovalo pomocí skriptování redis-py a Lua.

redis-py nedefinuje wrapper pro příkaz SELECT (normálně používaný k přepínání aktuální databáze), kvůli základní implementaci fondu připojení bezpečného pro vlákna. Ale nic vám nebrání zavolat SELECT ze skriptu Lua.

Zvažte následující příklad:

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

Následující skript zobrazuje hodnotu mykey ve 2 databázích ze stejného klientského připojení.

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

Skript lua1 je naivní:pouze vybere danou databázi, než vrátí hodnotu. Jeho použití je zavádějící, protože po jeho provedení se aktuální databáze spojená s připojením změnila. Nedělejte to.

Skript lua2 je mnohem lepší. Jako parametry bere cílovou databázi a aktuální databázi. Zajišťuje, že aktuální databáze je znovu aktivována před koncem skriptu, takže další příkaz použitý na připojení stále běží ve správné databázi. Bohužel ve skriptu Lua není žádný příkaz, který by uhádl aktuální databázi, takže klient musí ji poskytovat systematicky. Vezměte prosím na vědomí, že skript Lua musí na konci resetovat aktuální databázi, ať se stane cokoliv (i v případě předchozí chyby), takže složité skripty jsou těžkopádné a nepohodlné.




  1. Model.find().toArray() tvrdí, že nemá metodu .toArray().

  2. Je bezpečné odstranit soubor deníku mongodb?

  3. Redis vs. MongoDB:Porovnání databází v paměti s Percona Memory Engine

  4. Jak nasadit modely ML do výroby