Redis中的删除策略和逐出算法
删除策略和逐出算法是两个完全不同的东西,千万不要搞混淆了。
删除策略
删除策略指的是,当key设置了过期时间,如果到了过期时间,那么采用什么策略来删除这个过期的key.
3种删除策略
- 定时删除(当定时器计数完就将该数据删除,消耗CPU资源);
- 惰性删除(计时器到点后不立马删除,而是下一次再使用的时候删除,相当于以空间换时间);
- 定期删除(相当于前两个方案的折衷,以一定的周期执行删除操作,即每秒执行删除操作的CPU占有率有一个上线,在具体执行删除操作中又会采用一定的策略先选取M个key看过期率,然后再执行下一个数据库的删除策略还是采取当前数据库的全库扫描)
定时删除 | 节约内存 | 不分时段占用CPU资源,频度高 | 拿时间换空间 |
惰性删除 | 内存占用严重 | 延时执行,CPU利用率高 | 拿空间换时间 |
定期删除 | 内存定期随机清理 | 每秒话费固定的CPU资源维护内存 | 随机抽查,重点抽查 |
逐出算法
逐出算法指的是,当Redis的内存不够了,又有新的key放进来,那么我们就需要从已有的key种选择某些淘汰掉以腾出空间供新key使用。
设置了过期时间的key中的逐出策略
检测易失数据(可能会过期的数据集server.db[i].expires)
- volatile-lru: 挑选最近最少使用的数据淘汰
- volatile-lfu: 挑选最近使用次数最少的数据淘汰
- volatile-ttl: 挑选将要过期的数据淘汰
- volatile-random: 在设置了过期时间的key中随机选择数据淘汰
LRU: Least Recently Used
LFU: Least Frequently Used
所有key中的逐出策略
检测全库数据(所有数据集server.db[i].dict)
- allkeys-lru: 挑选最近最少使用的数据淘汰
- allkeys-lfu: 挑选最近使用次数最少的数据淘汰
- allkeys-random: 在所有key中随机挑选设置了过期时间的数据淘汰
不使用逐出策略
no-eviction: 禁止驱逐数据(Redis默认策略),会引发OOM(Out OfMemory)
配置
在启动配置文件中:
maxmemory-policy volatile-lru
使用INFO命令输出监控信息,查询缓存hit和miss的次数,根据业务需求调优Redis配置。