4 设置键的生存时间或过期时间
通过EXPIRE命令或者PEXPIRE命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间(TimeToLive,TTL),在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键:
127.0.0.1:6379> set test test
OK
127.0.0.1:6379> expire test 5
(integer) 1
127.0.0.1:6379> get test //5秒内
"test"
127.0.0.1:6379> get test //5秒后
(nil)
注意
SETEX命令可以在设置一个字符串键的同时为键设置过期时间,因为这个命令是一个类型限定的命令(只能用于字符串键),所以本章不会对这个命令进行介绍,但SETEX命令设置过期时间的原理和本章介绍的EXPIRE命令设置过期时间的原理是完全一样的。
与EXPIRE命令和PEXPIRE命令类似,客户端可以通过EXPIREAT命令或PEXPIREAT命令,以秒或者毫秒精度给数据库中的某个键设置过期时间(expiretime)。这时过期时间是一个UNIX时间截,当键的过期时间来临时,服务器就会自动从数据库中删除这个键:
redis> SET key value
OK
redis> EXPIREAT key 1377257300
(integer)1
redis> TIME
1)"01377257296"
2)"296543"
redis> GET key //1377257300之前
"value"
redis> TIME
1)"13772573031"
2)"230656"
redis>GET key //1377257300之后
(ni1)
TTL命令和PTTL命令接受一个带有生存时间或者过期时间的键,返回这个键的剩余生存时间,也就是,返回距离这个键被服务器自动删除还有多长时间:
redis> SET key value
OK
redis> EXPIRE key 1000
(integer)1
redis> TTL key
(integer)997
redis>SET another_key another_value
OK
redis> TIME
1)"1377333070"
2)"761687"
redis> EXPIREAT another_key 1377333100
(integer)1
redis> TTL another_key
(inteqer)10
4.1 设置过期时间
Redis有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除):
EXPIRE <key> <tl>
命令用于将键key的生存时间设置为ttl秒。PEXPIRE <key> <ttl>
命令用于将键key的生存时间设置为ttl毫秒。EXPIREAT <key> <timestamp>
命令用于将键key的过期时间设置为timestamp所指定的秒数时间截。PEXPIREAT <key> <timestamp>
命令用于将键key的过期时间设置为timestamg所指定的毫秒数时间截。
虽然有多种不同单位和不同形式的设置命令,但实际上EXPIRE、PEXPIRE、EXPIREAT三个命令都是使用PEXPIREAT命令来实现的:无论客户端执行的是以上四个命令中的哪个,经过转换之后,最终的执行效果都和执行PEXPIREAT命令一样。
首先,EXPIRE命令可以转换成PEXPIRE命令:
def EXPIRE(key,ttl_in_sec):
# 将TTL从秒转换成毫秒
ttl_in ms = sec_to_ms(ttl_in_sec)
PEXPIRE(key,ttlinms)
接着,PEXPIRE命令又可以转换成PEXPIREAT命令:
def PEXPIRE(key,ttl_in ms):
# 获取以毫秒计算的当前UNIX时间戳
now_ms= get_current_unix_timestamp_in_ms()
#当前时间加上TTL,得出毫秒格式的键过期时间
PEXPIREAT(keynow_ms+ttl_in_ms)
并且,EXPIREAT命令也可以转换成PEXPIREAT命令:
def EXPIREAT(key,expire_time_in_sec):
# 将过期时间从秒转换为毫秒PEXPIREEXPIREAT
expire_time_in_ms= sec_to_ms(expire_time_in_sec)
PEXPIREAT(key, expire_time in ms)
最终,EXPIRE、PEXPIRE和EXPIREAT三个命令都会转换成PEXPIREAT命令来执行,如图9-11所示
4.2
106页