Redis
 sql >> база данни >  >> NoSQL >> Redis

Да използвате множество DB с един Redis Lua скрипт?

Обикновено е погрешна идея да се поставят свързани данни в различни бази данни на Redis. Няма почти никаква полза в сравнение с дефинирането на пространства от имена чрез ключови конвенции за именуване (няма допълнителна детайлност по отношение на сигурността, постоянството, управлението на изтичане и т.н.). И основен недостатък е, че клиентите трябва ръчно да се справят с избора на правилната база данни, което е податливо на грешки за клиенти, насочени към няколко бази данни едновременно.

Сега, ако все пак искате да използвате множество бази данни, има начин да я накарате да работи с redis-py и Lua скриптове.

redis-py не дефинира обвивка за командата SELECT (обикновено използвана за превключване на текущата база данни) поради основната реализация на пула за безопасни за нишки връзки. Но нищо не ви пречи да извикате SELECT от Lua скрипт.

Помислете за следния пример:

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

Следният скрипт показва стойността на mykey в 2-те бази данни от една и съща клиентска връзка.

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

Скриптът lua1 е наивен:той просто избира дадена база данни, преди да върне стойността. Използването му е подвеждащо, тъй като след изпълнението му текущата база данни, свързана с връзката, се е променила. Не правете това.

Скриптът lua2 е много по-добър. Той приема целевата база данни и текущата база данни като параметри. Той гарантира, че текущата база данни се активира отново преди края на скрипта, така че следващата команда, приложена към връзката, все още се изпълнява в правилната база данни. За съжаление няма команда за отгатване на текущата база данни в скрипта Lua, така че клиентът трябва да го предоставя системно. Моля, имайте предвид, че Lua скриптът трябва да нулира текущата база данни в края, каквото и да се случи (дори в случай на предишна грешка), така че прави сложните скриптове тромави и неудобни.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. изключете redis-сървъра от командния ред

  2. Как да променя между базата данни Redis?

  3. Как да използвате ActionController::На живо заедно с Resque + Redis (за приложение за чат)

  4. Управление на връзката с redis от Python

  5. Преброяване на потребителите на socket.io в хоризонтални сървъри