在redis中,如果在一段时间内没有访问密钥,我们如何删除它

q9yhzks0  于 2021-06-10  发布在  Redis
关注(0)|答案(2)|浏览(331)

在redis中,我首先存储密钥值。我将使用get命令检查键是否存在于随后的请求中以检索值。如果某个密钥在某个时间段(如60分钟)内未被访问,则应删除该密钥。否则就只能这样了。那么,我们怎样才能达到这个要求呢。我知道redis中有ttl功能,但它会在指定的持续时间后删除,但我希望只有在60分钟内不被访问时才应该删除密钥。

w6lpcovy

w6lpcovy1#

redis中的ttl不能按hset中的每个键设置,只能按整组设置,原因是实现起来比较复杂,redis的创建者希望尽量简单。
以下是一些解决方法:
使用顶级set/get和ttl/expire命令代替hset
在值存储过期时间中,当您获取值并更新过期时间时,从客户端发出delete命令,获取key/value并发现应该已经过期

ej83mcc0

ej83mcc02#

如果可以将数据保存为键值对,即字符串,而不是哈希。你可以通过 SET 命令和lua脚本:
设置操作
当您需要设置一个键值对时,还需要指定一个ttl,以确保如果在60秒内没有访问权限,则会自动删除该键:

SET key value EX 60

获取操作
当您尝试获取值时,如果键存在,还可以使用lua脚本将其ttl重置为60秒:

-- get.lua
local key = KEYS[1]
local val = redis.call("get", key)
if (val) then
    redis.call("expire", key, 60)
end
return val

注意:如果您不想每次都用set命令指定ttl,或者您的redis版本不支持 EX 选项,也可以将 SET 以及 EXPIRE 命令转换为lua脚本。

相关问题