Сценарий redis lua против одиночных вызовов

У меня есть следующая установка:

  • 2 разные структуры данных: наборы, строки
  • Они находятся в разных пространствах имен *:collections:*, *:resources:*
  • Клиент об этом не знает, и я каждый раз пытаюсь получить оба пространства имен.
  • На основе exists я решаю, какую структуру данных получить окончательно.
  • все вызовы Redis выполняются асинхронно (vert.x redis-mod)

Теперь мне нужно решить, выполнять ли это как сценарий lua или как отдельные команды.

Сценарий lua, который я придумал:

local path = KEYS[1]
local resourcesPrefix = ARGV[1]
local collectionsPrefix = ARGV[2]

if redis.call('exists',resourcesPrefix..path) == 1 then
    return redis.call('get',resourcesPrefix..path)
elseif redis.call('exists',collectionsPrefix..path) == 1 then
    return redis.call('smembers',collectionsPrefix..path)
else
    return "notFound"
end 

Есть ли плюсы и минусы для одиночных вызовов или скрипта lua?


person haschibaschi    schedule 11.03.2014    source источник
comment
какие плюсы и минусы, по вашему мнению, могут иметь значение? скорость? что-то еще?   -  person Oliver    schedule 12.03.2014


Ответы (2)


Да, LUA скрипт - лучшее решение в случае EVALSHA вызова:

  • Вы работаете с Redis асинхронно. Таким образом, LUA помогает сократить количество кода и его читабельность.
  • LUA случае быстрее из-за уменьшения сетевого обмена данными.

Я думаю, вы можете написать свой код всего двумя командами. Вам не нужно exists в вашем коде.

local path = KEYS[1]
local resourcesPrefix = ARGV[1]
local collectionsPrefix = ARGV[2]
local ret

set ret = redis.call('get',resourcesPrefix..path)
if ret then
   return ret
end  
set ret = redis.call('smembers',collectionsPrefix..path)
if ret then
   return ret
end  

return "notFound" 
person misterion    schedule 12.03.2014

Мне кажется, это хорошее использование сценариев Redis LUA. Время выполнения будет коротким (следует избегать длинных сценариев, поскольку они блокируют). Это позволяет избежать многократных вызовов, что сокращает общее время связи по сети. Поэтому я думаю, что это лучшее решение, чем одиночные вызовы, если вы делаете много таких вызовов. Особенно, если вы используете EVALSHA для кэширования скрипта в Redis.

person Pascal Le Merrer    schedule 11.03.2014