Redis是否已设置条件?

问题描述

我正在寻找这样的东西:

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

我找不到解决此问题的方法, 最接近的一种方法是使用WATCH,但是不幸的是,它无法监视特定的value条件。

如果redis无法做到这一点,那么您在内存中是否建议任何支持Redis功能(如Redis)?

解决方法

您可以使用EVAL command

使用Lua脚本进行此操作

假设您要同时设置更新时间戳和数据值,并且如果也没有时间戳也设置值(对于首次设置),那么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。