Redis EXPIRE命令

Redis EXPIRE命令教程

Redis EXPIRE 命令为 Redis 中给定 KEY 设置生存时间,当 KEY 过期时(生存时间为 0 ),它会被自动删除。在 Redis 中,带有生存时间的 KEY 被称为 “易失的”。

Redis EXPIRE命令改变生存时间

Redis 生存时间可以通过使用 DEL 命令删除整个 KEY 来移除,或者被 SETGETSET 命令覆写,这意味着,如果一个命令只是修改一个带生存时间的 KEY 的值而不是用一个新的 KEY 值来代替它的话,那么生存时间不会被改变。

比如说,对一个 KEY 执行 INCR 命令,对一个 列表 进行 LPUSH 命令,或者对一个 哈希表 执行 HSET 命令,这类操作都不会修改 KEY 本身的生存时间。

另一方面,如果使用 RENAME 对一个 KEY 进行改名,那么改名后的 KEY 的生存时间和改名前一样。

RENAME 命令的另一种可能是,尝试将一个带生存时间的 KEY 改名成另一个带生存时间的 another_KEY ,这时旧的 another_KEY (以及它的生存时间)会被删除,然后旧的 KEY 会改名为 another_KEY ,因此,新的 another_KEY 的生存时间也和原本的 KEY 一样。

使用 PERSIST 命令可以在不删除 KEY 的情况下,移除 KEY 的生存时间,让 KEY 重新成为一个 “持久的”(persistent) KEY 。

Redis EXPIRE命令详解

语法

192.168.98.70:6379> EXPIRE KEY_NAME seconds

参数

参数 描述
KEY_NAME 要设置过期时间的键。
seconds 要设置的具体的过期时间,秒为单位。

返回值

Redis EXPIRE 命令设置成功返回 1 。当 KEY 不存在或者不能为 KEY 设置生存时间时(比如在低于 2.1.3 版本的 Redis 中你尝试更新 KEY 的生存时间),返回 0 。

时间复杂度

O(1)

可用版本

>= 1.0.0

Redis 2.1.3之前的不同之处

在 Redis 2.1.3 之前的版本中,修改一个带有生存时间的 KEY 会导致整个 KEY 被删除,这一行为是受当时复制(replication)层的限制而作出的,现在这一限制已经被修复。

精度

在 Redis 2.4 版本中,过期时间的延迟在 1 秒钟之内 —— 也即是,就算 KEY 已经过期,但它还是可能在过期之后一秒钟之内被访问到,而在新的 Redis 2.6 版本中,延迟被降低到 1 毫秒之内。

说明

可以对一个已经带有生存时间的 KEY 执行 EXPIRE 命令,新指定的生存时间会取代旧的生存时间。

案例

设置Redis键过期时间

使用 EXPIRE 命令,设置 KEY 的生存时间

# 设置过期时间 192.168.98.70:6379> SET haicoder.net Redis OK 192.168.98.70:6379> EXPIRE haicoder.net 1000 (integer) 1 # 查看过期时间 192.168.98.70:6379> TTL haicoder.net (integer) 995 # 修改过期时间 192.168.98.70:6379> EXPIRE haicoder.net 1000 (integer) 1 192.168.98.70:6379> TTL haicoder.net (integer) 998 192.168.98.70:6379> DEL haicoder.net Redis (integer) 1

我们首先,使用 EXPIRE 命令设置 KEY 的过期时间,接着,使用 TTL 命令查看 KEY 的剩余生存时间。同时,我们可以看到对已经存在生存时间的 KEY 再次使用 EXPIRE 命令,会覆盖原来的生存时间。

改变KEY生成时间

对存在生存时间的 KEY 进行 SET 新值,生成时间被清除

# 设置 KEY 192.168.98.70:6379> SET haicoder.net redis OK 192.168.98.70:6379> EXPIRE haicoder.net 1000 (integer) 1 192.168.98.70:6379> TTL haicoder.net (integer) 995 192.168.98.70:6379> SET haicoder.net redis OK 192.168.98.70:6379> TTL haicoder.net (integer) -1 192.168.98.70:6379> DEL haicoder.net (integer) 1

我们首先,使用 EXPIRE 命令设置 KEY 的过期时间为 1000 秒。接着,使用 TTL 命令查看 KEY 的剩余生存时间为 995 秒。

此时,再次使用 SET 命令,对一个存在生成存时间的 KEY 重新设置值。最后,我们再次使用 TTL 命令查看 KEY 的剩余生存时间返回 -1,表明 KEY 没有生存时间。

重命名KEY

对存在生存时间的 KEY 进行 SET 新值,生成时间被清除

# RENAME KEY 192.168.98.70:6379> SET haicoder.net Redis OK 192.168.98.70:6379> EXPIRE haicoder.net 1000 (integer) 1 192.168.98.70:6379> TTL haicoder.net (integer) 996 192.168.98.70:6379> RENAME haicoder.net haicoder OK 192.168.98.70:6379> TTL haicoder (integer) 985 192.168.98.70:6379> DEL haicoder (integer) 1

我们首先,使用 EXPIRE 命令设置 KEY 的过期时间为 1000 秒。接着,我们使用 TTL 命令查看 KEY 的剩余生存时间为 996 秒。

使用 RENAME 命令,将键 haicoder.net 重命名为 haicoder。此时,再次使用 TTL 命令查看 KEY 的剩余生存时间为 985 秒,说明原来的键的生存时间没有丢失。

持久化 KEY

使用 PERSIST 命令,移除 KEY 生存时间

# 持久化 KEY 192.168.98.70:6379> SET haicoder.net redis OK 192.168.98.70:6379> EXPIRE haicoder.net 1000 (integer) 1 192.168.98.70:6379> TTL haicoder.net (integer) 994 192.168.98.70:6379> PERSIST haicoder.net (integer) 1 192.168.98.70:6379> TTL haicoder.net (integer) -1 192.168.98.70:6379> DEL haicoder.net (integer) 1

我们首先,使用 EXPIRE 命令设置 KEY 的过期时间为 1000 秒。接着,使用 TTL 命令查看 KEY 的剩余生存时间为 994 秒。

再次,使用 PERSIST 命令,移除键 haicoder.net 的生存时间。最后,我们再次使用 TTL 命令查看 KEY 的剩余生存时间返回 -1,表明 KEY 没有生存时间。

数据操作

数据操作,不影响 KEY 的生存时间

192.168.98.70:6379> LPUSH haicoder.net redis (integer) 1 192.168.98.70:6379> EXPIRE haicoder.net 1000 (integer) 1 192.168.98.70:6379> TTL haicoder.net (integer) 996 192.168.98.70:6379> LPUSH haicoder.net mongo (integer) 2 192.168.98.70:6379> LPUSH haicoder.net mysql (integer) 3 192.168.98.70:6379> TTL haicoder.net (integer) 976 192.168.98.70:6379> DEL haicoder.net (integer) 1

我们首先,使用 LPUSH 向键 haicoder.net 插入值 redis。接着,使用 EXPIRE 命令设置 KEY 的过期时间为 1000 秒。此时,使用 TTL 命令查看 KEY 的剩余生存时间为 996 秒。

再次使用 LPUSH 向键 haicoder.net 插入值 mongo。接着,再次使用 LPUSH 向键 haicoder.net 插入值 mysql。

此时,使用 TTL 命令查看 KEY 的剩余生存时间为 976 秒,说明对已存在的 KEY 进行数据操作,不会影响 KEY 的生存时间。

KEY不存在

KEY 不存在,返回 0

192.168.98.70:6379> DEL haicoder.net (integer) 0 192.168.98.70:6379> EXPIRE haicoder.net 1000 (integer) 0 192.168.98.70:6379> SET haicoder.net redis OK 192.168.98.70:6379> EXPIRE haicoder.net 1000 (integer) 1 192.168.98.70:6379> DEL haicoder.net (integer) 1

当 KEY 不存在时,使用 EXPIRE 命令返回 0。当 KEY 存在时,使用 EXPIRE 命令返回 1。

Redis EXPIRE命令总结

Redis EXPIRE 命令为 Redis 中给定 KEY 设置生存时间,当 KEY 过期时(生存时间为 0 ),它会被自动删除。Redis EXPIRE 命令语法:

192.168.98.70:6379> EXPIRE KEY_NAME seconds