15

当生存时间达到 0 时,我的 redis 服务器不会删除密钥。

这是一个示例代码:

redis-cli
>SET mykey "ismykey"
>EXPIRE mykey 20
#check TTL
>TTL mykey
>(integer) 17
> ...
>TTL mykey
>(integer) -1
#mykey chould have expired:
>EXISTS mykey
>(integer) 1
>#oh still there, check its value
>GET mykey
>"ismykey"

如果我检查 redis 返回的信息,它会说 0 个密钥已过期。

任何想法?

谢谢。

4

1 回答 1

22

由于您正在执行“...”,因此很难确定,但我会说您在该部分设置 mykey ,这将有效地消除过期。

来自 EXPIRE 手册

仅当使用 DEL 命令删除密钥或使用 SET 或 GETSET 命令覆盖密钥时才会清除超时

另外,关于 TTL 的 -1 回复

返回值

整数回复:以秒为单位的 TTL,如果密钥不存在或没有超时,则为 -1。

编辑:请注意,此行为在 Redis 2.8 中发生了变化

从 Redis 2.8 开始,发生错误时的返回值发生了变化:
如果键不存在,该命令返回 -2。
如果密钥存在但没有关联的过期,则该命令返回 -1。

换句话说,如果您的密钥存在,它似乎是持久的,即没有任何过期设置。

编辑:如果我在 REDIS 从属服务器上创建密钥,我似乎可以重现这一点,从属服务器不会在没有主输入的情况下删除密钥,因为通常您不会在从属服务器上本地创建密钥。这是这里的情况吗?

然而,虽然连接到主节点的从节点不会独立地使密钥过期(但会等待来自主节点的 DEL),但它们仍将采用数据集中存在的过期状态的完整状态,因此当从节点被选为master 它将能够独立地使密钥过期,完全充当主人。

于 2012-08-07T15:31:26.960 回答