Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Używać wielu baz danych z jednym skryptem Redis Lua?

Zwykle błędnym pomysłem jest umieszczanie powiązanych danych w różnych bazach danych Redis. Nie ma prawie żadnych korzyści w porównaniu do definiowania przestrzeni nazw za pomocą konwencji nazewnictwa kluczy (brak dodatkowej szczegółowości w zakresie bezpieczeństwa, trwałości, zarządzania wygasaniem itp.). Główną wadą jest to, że klienci muszą ręcznie obsługiwać wybór właściwej bazy danych, co jest podatne na błędy w przypadku klientów, którzy wybierają wiele baz danych jednocześnie.

Teraz, jeśli nadal chcesz korzystać z wielu baz danych, istnieje sposób, aby działały ze skryptami redis-py i Lua.

redis-py nie definiuje opakowania dla polecenia SELECT (zwykle używanego do przełączania bieżącej bazy danych), ze względu na podstawową implementację bezpiecznej wątkowo puli połączeń. Ale nic nie stoi na przeszkodzie, aby wywołać SELECT ze skryptu Lua.

Rozważ następujący przykład:

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

Poniższy skrypt wyświetla wartość mykey w 2 bazach danych z tego samego połączenia klienta.

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

Skrypt lua1 jest naiwny:po prostu wybiera daną bazę danych przed zwróceniem wartości. Jego użycie jest mylące, ponieważ po jego wykonaniu zmieniła się bieżąca baza danych powiązana z połączeniem. Nie rób tego.

Skrypt lua2 jest znacznie lepszy. Pobiera docelową bazę danych i bieżącą bazę danych jako parametry. Upewnia się, że aktualna baza danych jest reaktywowana przed zakończeniem skryptu, dzięki czemu kolejne polecenie zastosowane na połączeniu nadal działa we właściwej bazie danych. Niestety nie ma polecenia odgadnięcia bieżącej bazy w skrypcie Lua, więc klient musi je systematycznie dostarczać. Pamiętaj, że skrypt Lua musi na końcu zresetować bieżącą bazę danych, cokolwiek się stanie (nawet w przypadku poprzedniego błędu), co sprawia, że ​​złożone skrypty stają się kłopotliwe i niewygodne.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis C# - Używanie wartości Incr w transakcji

  2. Laravel 4 :Wywołanie niezdefiniowanej metody Redis::connection()

  3. Błąd jemalloc/jemalloc.h:Brak takiego pliku lub katalogu podczas tworzenia Redis

  4. jak uzyskać dostęp do sesji gniazda we wszystkich klastrach

  5. Tworzenie słuchacza redis - możliwe w php?