一起学Redis(8)——过期时间和通知

本文详细介绍了Redis中键的过期时间和删除策略,包括定时删除、惰性删除和定期删除,以及它们的优缺点。同时,讨论了Redis如何在RDB、AOF和复制中处理过期键,并介绍了数据库通知功能,允许客户端订阅键的变化和命令执行情况。
摘要由CSDN通过智能技术生成
设置键的生存时间或过期时间

通过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 就是过期字典。图示如下:

image

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值