三种删除策略
·定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作。
·惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
·定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。
优缺点
定时删除 对内存是有好的能够尽快删除过期键来释放内存,但是对cpu不友好过期键比较多的话删除行为就会占用相当一部分cpu影响性能
惰性删除 对CPU最友好、只有查出键时才检查是否过期,但是对内存不够友好,会占用大量内存不能及时释放
定期删除 是定期删除和惰性删除的折中、但是依赖删除操作执行时长和频率的设定。不合理的话也会存在上面两种问题;
实现
惰性删除策略的实现
过期键的惰性删除策略由db.c/expireIfNeeded函数实现,所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查:
定期删除策略的实现
过期键的定期删除策略由redis.c/activeExpireCycle函数实现,每当Redis的服务器周期性操作redis.c/serverCron函数执行时,activeExpireCycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键。
redis 提供 6种数据淘汰策略(内存溢出控制策略):
4.0版本后增加以下两种:
参考
https://snailclimb.gitee.io/javaguide/#/database/Redis/Redis JavaGuide
黄健宏 著. Redis设计与实现 (Chinese Edition) (Kindle 位置 1903-1907). Kindle 版本.