#caching #redis #in-memory-database
#кэширование #redis #база данных в памяти
Вопрос:
Я ищу что-то вроде этого:
update data
set data = new_data
where data.updated_at < new_data.updated_at
Я не могу найти решение для этой проблемы,
Ближайшим вариантом является использование, WATCH
но, к сожалению, он не может отслеживать конкретное value
условие.
Если redis не может этого сделать, есть ли у вас какие-либо рекомендуемые в памяти, такие как Redis, которые поддерживают эту функцию?
Ответ №1:
Вы можете сделать это с помощью скриптов Lua, используя EVAL
command
Предполагая, что вы хотите установить как временную метку обновления, так и значение данных, и если временная метка также не устанавливает значения (для первого набора), сценарий Lua может быть чем-то вроде:
local updt = redis.call('GET', KEYS[1])
if (not updt) or (tonumber(updt) < tonumber(ARGV[1])) then
return redis.call('MSET', KEYS[1], ARGV[1], KEYS[2], ARGV[2])
else
return redis.error_reply('data is newer on server!')
end
Вы можете вызвать как:
EVAL "local updt = redis.call('GET', KEYS[1]) if (not updt) or (tonumber(updt) < tonumber(ARGV[1])) then return redis.call('MSET', KEYS[1], ARGV[1], KEYS[2], ARGV[2]) else return redis.error_reply('data is newer on server!') end" 2 dataUpdated data 1 initVal
В скриптах Lua вы найдете очень мощный инструмент для получения максимальной отдачи от Redis.