redis是否设置了条件?

mpbci0fu  于 2021-06-08  发布在  Redis
关注(0)|答案(1)|浏览(447)

我在找这样的东西:

update data
set data = new_data
where data.updated_at < new_data.updated_at

我找不到解决这个问题的办法,最接近的办法就是使用 WATCH 但不幸的是,它不能观察具体的 value 条件。
如果redis做不到这一点,你有没有推荐像redis这样的内存支持这个功能?

nr9pn0ug

nr9pn0ug1#

您可以使用lua脚本,使用 EVAL 命令
假设您想要同时设置更新时间戳和数据值,并且如果没有时间戳也要设置值(对于首次设置),那么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。

相关问题