Есть ли у Redis Set with condition?

#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.