小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
redisDb结构的expires字典保存了数据库中所有键的过期时间,称这个字典为过期字典:
过期字典的键是一个指针,指向键空间中的某个键对象;
值是一个long long类型的整数,指向数据库的过期时间,毫秒精度。
设置过期时间:
expire key ttl
pexpire key ttl
expireat key timestamp
pexpireat key timestamp
前3个命令都是使用pexpireat来实现的
返回剩余生存时间:
ttl
pttl
过期键的删除策略
定时删除
设置键的过期时间的同时创建一个定时器,让定时器在键的到期时间来临时立即执行对键的删除操作。
优缺点:
- 过期键会被尽快删除并释放内存,从而节省内存
- 占用cpu,影响数据库的响应时间和吞吐量(查找事件的时间复杂度为O(n))
惰性删除
放任过期键不管,但每次获取键时检查键是否过期,如果过期的话执行删除键操作
优缺点:
- 占用很少的CPU,只有当取键时才可能对键进行删除,也就是说删除操作只会在非做不可的情况下进行。
- 无用的过期键可能一直没有被删除,从而会占用大量的内存导致内存资源紧张。
定期删除
每隔一段时间对数据库进行一次检出,删除里面的过期键。至于删除多少个过期键、检查多少个数据库则由算法来决定。
难以确定删除操作执行的时长和频率:
- 如果太频繁或者执行时间过长,退化成定时删除,导致CPU时间过多地消耗在删除过期键上面;
- 如果执行的太少或者时间太短,退化成惰性删除,出现浪费内存。
redis中采用的是惰性删除+定期删除