是否有可用于Redis的原子GET
+ EXPIRE
命令?这将作为一个滑动到期值:尝试获取密钥指定的值,然后仅当使用此请求找到密钥时,设置生存时间为X秒。
答案 0 :(得分:3)
不,没有,但是没有什么能阻止你在MULTI/EXEC
块中使用Lua脚本一个接一个地发送这两个命令。在不存在的密钥上使用EXPIRE
不会做任何事情。
答案 1 :(得分:0)
或者,我使用简单的Lua脚本:
local val, err = redis.pcall('GET', KEYS[1])
if err then
return err
end
redis.call('EXPIRE', KEYS[1], ARGV[1])
return {val}
在Golang你可以做到:
import "github.com/go-redis/redis"
const lua = `
local val, err = redis.pcall('GET', KEYS[1])
if err then
return err
end
redis.call('EXPIRE', KEYS[1], ARGV[1])
return {val}
`
redisGetEx = redis.NewScript(lua)
result, err = redisGetEx.Run(redisClient, []string{"key"}, 1800).Result()