问题描述
我正在寻找这样的东西:
update data
set data = new_data
where data.updated_at < new_data.updated_at
我找不到解决此问题的方法,
最接近的一种方法是使用WATCH
,但是不幸的是,它无法监视特定的value
条件。
如果redis无法做到这一点,那么您在内存中是否建议任何支持Redis的功能(如Redis)?
解决方法
您可以使用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',ARGV[2]) else return redis.error_reply('data is newer on server!') end" 2 dataUpdated data 1 initVal
您会在Lua Scripts中找到一个非常有用的工具,可以最大限度地利用Redis。