Redis过期键删除策略及原理
2022-04-14 本文已影响0人
_Gaara_
基本简介
通过EXPIRE命令或者PEXPIRE命令,客户端可以以秒或者毫秒精度对库中的键设置生存时间(Time To Live,TTL)
SETNX可以在设置一个字符串键的同时设置过期时间。
TTL/ PTTL key 返回当前键的剩余时间
使用场景
这也就是常用的,分布式锁的基本实现方式。
过期键删除策略
首先是明确:过期时间,存储在redisDB结构的expires字典里。这个字典称之为过期字典。
字典的键是一个指针,指向键空间里的某个键对象。
字典的值是一个long的整数,保存过期时间的毫米级unix时间戳。
过期删除策略共有三种:
- 定时删除
定时删除,是在设置键的同时创建一个定时器,使其在时间到期时立刻删除键。这个策略对CPU时间极不友好,运算密集型服务中很有可能出现当前CPU时间片内执行的是与业务无关的内容。会对高并发业务的响应时间和吞吐量产生影响。除此之外,定时器的底层实现是一个无序链表,查询一个事件的时间复杂度是O(N)。 - 惰性删除
对于CPU来说是极为友好的,只在程序取出键之前做一个到期检查。到期了则删除并返回null。否则什么都不做。对于内存来说极不友好。这种情况可以视为内存泄漏,无用的垃圾内存不能删除。 - 定期删除
这是一种折中方案,惰性删除部分由db.c/expireIfNeeded 函数实现,如果输入键已经过期,则删除,否则不做操作。定时删除部分由redis.c/activeExpireCycle实现,当Redis的服务器周期性操作redis.c/serverCorn函数执行时,该函数就会被调用,规定时间内分多次遍历服务器中各个数据库,从expries字典中随机检查一部分过期键的过期时间,并删除其中的过期键。