你必须非常努力,才能看起来毫不费力!
微信搜索公众号[ 漫漫Coding路 ],一起From Zero To Hero !
前言
本篇文章我们来学习下Redis 过期时间的相关命令!
EXPIRE
可用版本:>= 1.0.0
时间复杂度:O(1)
命令格式
EXPIRE key seconds [NX|XX|GT|LT]
命令描述
- 给key设定一个存活时间(单位为秒),当key过期后会被删除;
- 对一个已经带有生存时间的 key 执行 EXPIRE 命令,新指定的生存时间会取代旧的生存时间。
- 使用
DEL
删除一个key后,对应的过期时间也会被删除; - 使用
SET
、GETSET
等保存命令时,过期时间会被覆盖; - 对于其它命令,如果只是修改key对应的value,而不是重新设置的话,过期时间不变。例如使用
INCR
命令增加value值、使用LPUSH
添加新的元素、使用HSET
修改field对应的value; - 如果对一个key,使用RENAME命令重命名,新的key继承原来key的过期时间;
- 使用PERSIST命令,可以清除过期时间,使key永不过期;
可选参数
自Redis 7.0,EXPIRE支持如下参数:
- NX:只有当key没有设置过期时间,才会执行命令(已经设置过的,不能再设置)
- XX :只有当key有过期时间,才会执行命令设置(没有设置过的,不能设置)
- GT :只有当新的过期时间大于当前过期时间时,才会设置(只会增加过期时间)
- LT :只有当新的过期时间大于当前过期时间时,才会设置(只会减少过期时间)
返回值
1:设置成功
0:设置失败
示例
127.0.0.1:6379> set mykey hello
OK
# 查看过期时间(永不过期)
127.0.0.1:6379> ttl mykey
(integer) -1
# 设置过期时间为100s
127.0.0.1:6379> expire mykey 100
(integer) 1
127.0.0.1:6379> ttl mykey
(integer) 98
# 再次设置,会覆盖原有的过期时间
127.0.0.1:6379> expire mykey 1000
(integer) 1
127.0.0.1:6379> ttl mykey
(integer) 997
EXPIREAT
可用版本:>= 1.2.0
时间复杂度:O(1)
命令格式
EXPIREAT key timestamp [NX|XX|GT|LT]
命令描述
- 与
EXPIRE
功能类似,不同点在于,EXPIREAT
设置的过期时间为Unix秒级时间戳,而不是生存秒数。
可选参数
自Redis 7.0,EXPIREAT
支持如下参数:
- NX:只有当key没有设置过期时间,才会执行命令(已经设置过的,不能再设置)
- XX :只有当key有过期时间,才会执行命令设置(没有设置过的,不能设置)
- GT :只有当新的过期时间大于当前过期时间时,才会设置(只会增加过期时间)
- LT :只有当新的过期时间大于当前过期时间时,才会设置(只会减少过期时间)
返回值
1:设置成功
0:设置失败
示例
127.0.0.1:6379> set mykey hello
OK
127.0.0.1:6379> ttl mykey
(integer) -1
# 设置过期时间
127.0.0.1:6379> expireat mykey 1632104800
(integer) 1
127.0.0.1:6379> ttl mykey
(integer) 163
EXPIRETIME
可用版本:>= 7.0.0
时间复杂度:O(1)
命令格式
EXPIRETIME key
命令描述
- 与
EXPIREAT
对应,返回key过期的秒级Unix时间戳
返回值
- 正数:秒级Unix时间戳
- 负数:代表发生了error
- -1:key存在,没有设置过期时间
- -2:key不存在
PEXPIRE
可用版本:>= 2.6.0
时间复杂度:O(1)
命令格式
PEXPIRE key milliseconds [NX|XX|GT|LT]
命令描述
- 与
EXPIRE
功能类似,不同点在于,PEXPIRE
设置的生存时间单位是毫秒
,而不是秒
可选参数
自Redis 7.0,PEXPIRE
支持如下参数:
- NX:只有当key没有设置过期时间,才会执行命令(已经设置过的,不能再设置)
- XX :只有当key有过期时间,才会执行命令设置(没有设置过的,不能设置)
- GT :只有当新的过期时间大于当前过期时间时,才会设置(只会增加过期时间)
- LT :只有当新的过期时间大于当前过期时间时,才会设置(只会减少过期时间)
返回值
1:设置成功
0:设置失败
示例
127.0.0.1:6379> set mykey hello
OK
127.0.0.1:6379> pexpire mykey 100000
(integer) 1
127.0.0.1:6379> ttl mykey
(integer) 93
PEXPIREAT
可用版本:>= 2.6.0
时间复杂度:O(1)
命令格式
PEXPIREAT key milliseconds-timestamp [NX|XX|GT|LT]
命令描述
- 与
EXPIREAT
功能类似,不同点在于,PEXPIREAT
设置的过期时间为Unix毫秒
级时间戳,而不是秒级时间戳。
可选参数
自Redis 7.0,PEXPIREAT
支持如下参数:
- NX:只有当key没有设置过期时间,才会执行命令(已经设置过的,不能再设置)
- XX :只有当key有过期时间,才会执行命令设置(没有设置过的,不能设置)
- GT :只有当新的过期时间大于当前过期时间时,才会设置(只会增加过期时间)
- LT :只有当新的过期时间大于当前过期时间时,才会设置(只会减少过期时间)
返回值
1:设置成功
0:设置失败
示例
127.0.0.1:6379> set mykey hello
OK
127.0.0.1:6379> pexpireat mykey 1632105572072
(integer) 1
127.0.0.1:6379> ttl mykey
(integer) 154
PEXPIRETIME
可用版本:>= 7.0.0
时间复杂度:O(1)
命令格式
EXPIRETIME key
命令描述
- 与
PEXPIREAT
对应,返回key过期的毫秒级Unix时间戳
返回值
- 正数:毫秒级Unix时间戳
- 负数:代表发生了error
- -1:key存在,没有设置过期时间
- -2:key不存在
TTL
可用版本:>= 1.0.0
时间复杂度:O(1)
命令格式
TTL key
命令描述
- 以秒为单位,返回
key
的剩余生存时间(TTL, time to live)。
返回值
- 正数:剩余生存时间(秒)
- 负数:代表发生了error
- -1:key存在,没有设置过期时间
- -2:key不存在
示例
127.0.0.1:6379> set mykey hello
OK
127.0.0.1:6379> ttl mykey
(integer) -1
127.0.0.1:6379> expire mykey 1000
(integer) 1
127.0.0.1:6379> ttl mykey
(integer) 992
PTTL
可用版本:>= 2.6.0
时间复杂度:O(1)
命令格式
PTTL key
命令描述
- 与
TTL
命令类似,不同点在于PTTL
以毫秒
为单位返回剩余生存时间。
返回值
- 正数:剩余生存时间(毫秒)
- 负数:代表发生了error
- -1:key存在,没有设置过期时间
- -2:key不存在
示例
127.0.0.1:6379> set mykey hello
OK
127.0.0.1:6379> pttl mykey
(integer) -1
127.0.0.1:6379> expire mykey 100
(integer) 1
127.0.0.1:6379> pttl mykey
(integer) 97767
PERSIST
可用版本:>= 2.2.0
时间复杂度:O(1)
命令格式
PERSIST key
命令描述
- 移除key的过期时间,使得key从易失的(有生存时间)变为持久的(永不过期)
返回值
- 1:移除成功
- 0:key不存在或者没有过期时间
示例
127.0.0.1:6379> set mykey htllo ex 1000
OK
127.0.0.1:6379> ttl mykey
(integer) 997
127.0.0.1:6379> persist mykey
(integer) 1
127.0.0.1:6379> ttl mykey
(integer) -1
总结
本文介绍了Redis 过期时间的相关操作,主要包括以下命令
- EXPIRE、PEXPIRE:设置生存时间(秒、毫秒)
- EXPIREAT、PEXPIREAT:设置具体时间点(Unix时间戳)
- EXPIRETIME、PEXPIRETIME:查询过期的时间戳
- TTL、PTTL:返回生存时间
- PERSIST:持久化key
更多
个人博客: https://lifelmy.github.io/
微信公众号:漫漫Coding路