Redis原子GET和EXPIRE

时间:2016-04-26 20:01:56

标签: redis

是否有可用于Redis的原子GET + EXPIRE命令?这将作为一个滑动到期值:尝试获取密钥指定的值,然后仅当使用此请求找到密钥时,设置生存时间为X秒。

2 个答案:

答案 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()