在redis中,我首先存储密钥值。我将使用get命令检查键是否存在于随后的请求中以检索值。如果某个密钥在某个时间段(如60分钟)内未被访问,则应删除该密钥。否则就只能这样了。那么,我们怎样才能达到这个要求呢。我知道redis中有ttl功能,但它会在指定的持续时间后删除,但我希望只有在60分钟内不被访问时才应该删除密钥。
w6lpcovy1#
redis中的ttl不能按hset中的每个键设置,只能按整组设置,原因是实现起来比较复杂,redis的创建者希望尽量简单。以下是一些解决方法:使用顶级set/get和ttl/expire命令代替hset在值存储过期时间中,当您获取值并更新过期时间时,从客户端发出delete命令,获取key/value并发现应该已经过期
ej83mcc02#
如果可以将数据保存为键值对,即字符串,而不是哈希。你可以通过 SET 命令和lua脚本:设置操作当您需要设置一个键值对时,还需要指定一个ttl,以确保如果在60秒内没有访问权限,则会自动删除该键:
SET
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脚本。
EX
EXPIRE
2条答案
按热度按时间w6lpcovy1#
redis中的ttl不能按hset中的每个键设置,只能按整组设置,原因是实现起来比较复杂,redis的创建者希望尽量简单。
以下是一些解决方法:
使用顶级set/get和ttl/expire命令代替hset
在值存储过期时间中,当您获取值并更新过期时间时,从客户端发出delete命令,获取key/value并发现应该已经过期
ej83mcc02#
如果可以将数据保存为键值对,即字符串,而不是哈希。你可以通过
SET
命令和lua脚本:设置操作
当您需要设置一个键值对时,还需要指定一个ttl,以确保如果在60秒内没有访问权限,则会自动删除该键:
获取操作
当您尝试获取值时,如果键存在,还可以使用lua脚本将其ttl重置为60秒:
注意:如果您不想每次都用set命令指定ttl,或者您的redis版本不支持
EX
选项,也可以将SET
以及EXPIRE
命令转换为lua脚本。