前言
Redis缓存淘汰策略与Redis键的过期删除策略并不完全相同,前者是在Redis内存使用超过一定值的时候(这个值可以配置)使用的淘汰策略;而后者是通过定期删除+惰性删除两者结合的方式进行内存淘汰的。
删除策略
可能的删除策略
定时删除:在设置键的过期时间的同时,创建一个定时器 timer. 让定时器在键的过期时间来临时,立即执行对键的删除操作。
定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。
惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
在上述的三种策略中定时删除和定期删除属于不同时间粒度的主动删除,惰性删除属于被动删除。
三种策略的优缺点
定时删除对内存使用率有优势,但是对 CPU 不友好;
定期删除是定时删除和惰性删除的折中;
惰性删除对内存不友好,如果某些键值对一直不被使用,那么会造成一定量的内存浪费。
Redis中实现
Reids 采用的是 惰性删除和定期删除 的结合。
淘汰策略
Redis六种淘汰策略
allkeys-lru:从所有 KV 集中优先对最近最少使用(less recently used)的数据淘汰
volatile-lru:从已设置过期时间的 KV 集中优先对最近最少使用(less recently used)的数据淘汰
volitile-ttl:从已设置过期时间的 KV 集中优先对剩余时间短(time to live)的数据淘汰
volitile-random:从已设置过期时间的 KV 集中随机选择数据淘汰
allKeys-random:从所有 KV 集中随机选择数据淘汰
noeviction:不淘汰策略,若超过最大内存,返回错误信息
4.0之后新增两种
allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的 key
volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰
最大内存限制和策略设置
redis.conf
maxmemory 100mb
maxmemory-policy allkeys-lru
lru与lfu区别
lfu比lru多了一个计数器,举个例子,如果触发内存淘汰,那么A距离的时间最久,但实际上A的使用频率要比B频繁,所以合理的淘汰策略应该是淘汰B。LFU就会淘汰B,而LRU会淘汰A。
网友评论