Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在redis中,如果密钥在一段时间内未被访问,我们如何删除_Redis - Fatal编程技术网

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

在redis中,如果密钥在一段时间内未被访问,我们如何删除,redis,Redis,在redis中,我首先存储密钥值。我将使用GET命令来检索值,以检查该键是否存在于后续请求中。如果某个密钥在一定时间内(如60分钟)未被访问,则应删除该密钥。否则就只能这样了。那么,我们怎样才能达到这个要求呢。我知道redis中存在TTL功能,但它将在指定的持续时间后删除,但我希望只有在60分钟内未访问该密钥时,才能删除该密钥。redis中的TTL不能在hset中为每个密钥设置,只能为每整组密钥设置 原因是实现会很复杂,redis的创建者希望它尽可能简单 以下是一些解决方法: 使用顶级set/g

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

redis中的TTL不能在hset中为每个密钥设置,只能为每整组密钥设置 原因是实现会很复杂,redis的创建者希望它尽可能简单

以下是一些解决方法:

  • 使用顶级set/get和TTL/EXPIRE命令代替hset
  • 在值存储过期时间中,当您获取值并更新过期时间时,从客户端发出delete命令,该命令获取密钥/值并发现该密钥/值应该已经过期

  • 如果您可以将数据保存为键值对,即字符串,而不是散列。您可以使用
    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脚本中。

    我可以使用SET/get aslo代替hset来存储无问题。但是有没有其他方法可以代替每次更新到期时间?我认为这是不可能的。我在谷歌上搜索过类似的问题,发现了这样一条线索:相貌相关