设置键的生存时间或过期时间
通过EXPIRE命令或者PEXPIRE命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间(Time To Live,TTL),在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键。EXPIREAT命令或者PEXPIREAT命令,以秒或者毫秒精度给数据库中的某个键设置过期时间(expire time)。
TTL命令和PTTL命令接受一个带有生存时间或者过期时间的键,返回这个键的剩余生存时间。
虽然有多重不同单位和格式的设置命令,但实际上EXPIRE、PEXPIRE、EXPIREAT 三个命令都是使用PEXPIREAT命令来实现的,最终都是调用的PEXPIREAT命令对应的方法实现的。
def EXPIRE(key, ttl_in_sec):
#将ttl从秒转换成毫秒
ttl_in_ms = sec_to_ms(ttl_in_sec)
PEXPIRE(key, ttl_in_ms)
PEXPIRE命令又转换成PEXPIREAT命令:
def PEXPIRE(key, ttl_in_ms):
#获取以毫秒计算的当前UNIX时间戳
now_ms = get_current_unix_timestamp_in_ms()
#当前时间加上TTL,得出毫秒格式的键过期时间
PEXPIREAT(key, now_ms+ttl_in_ms)
def EXPIREAT(key, expire_time_in_sec):
#将过期时间从秒转换为毫秒
expire_time_in_ms = sec_to_ms(expire_time_in_sec)
PEXPIREAT(key, expire_time_in_ms)
保存过期时间
redisDb结构的expires字典保存了数据库中所有键的过期时间,为过期字典,键就是数据库键,值是long long类型,毫秒经度的unix时间戳(过期时间)。redisDb代码如上面所示,dict * expires 就是过期字典。图示如下:
def PEXPIREAT(key, expire_time_in_ms):
if key not in redisDb.dict:
return 0
redisDb.expires[key] = expire_time_in_ms
#过期时间设置成功
return 1
移除过期时间
PERSIST 命令可以移除一个键的过期时间:
redis-> PEXPIREAT msg 1391234400000
(integer) 1
redis-> TTM msg
(integer) 13893281
redis-> PERSIST msg
(integer) 1
redis-> TTL msg
(integer) -1
代码如下:
def PERSIST(key):
if key not in redisDb.expires:
return 0
redisDb.expires.remove(key)
return 1
计算并返回剩余生存时间
TTL 命令以秒为单位返回键的剩余生存是时间,而PTTL命令则以毫秒为单位返回键的剩余生存时间。伪代码如下:
def PTTL(key):
if key not in redisDb.dict:
return -2
expire_time_in_ms = redisDb.expires.get(key)
if expire_time_in_ms is None:
return -1
n