Redis 内存回收
Redis之所以性能很强,最主要的原因是基于内存存储,然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能
可以通过修改配置文件来设置Redis的最大内存
maxmemory <bytes>
当内存达到上限时,就无法存储更多的数据
内存过期策略
Redis的TTL记录方式
- RedisDB种通过一个Dict记录每一个key的TTL时间
过期key的删除策略:
- 惰性清理:每次查找key是判断是否过期,如果过期则删除
- 定期清理:定期抽样部分key,判断是否过期,如果过期则删除
定期清理的两种方式
- SLOW模式执行频率默认为10,每次不超过25ms
- FAST模式执行频率不固定,单两次间隔不低于2ms,每次耗时不超过1ms
内存淘汰策略:
内存淘汰机制:就是当Redis内存达到设定的阈值时,Redis主动挑选部分key删除已释放更多内存的流程
8个策略:
- noeviction:不淘汰任何内存,但是内存满的时候不允许写入新的数据。【默认选项】
- volatile-ttl:对设置TTL的key,比较剩余的TTL,剩余的TTL越小越先被淘汰
- allkeys-random:对全体key,随即进行淘汰。也就是直接从db->dict种随机挑选
- volatile-random:对设置了TTL的key,随机进行淘汰,也就是db->dict种随机挑选
- allkeys-lru:对全体key,基于LRU算法进行淘汰
- volatile-lru:对设置过期时间的key,基于LRU算法进行淘汰
- allkeys-lfu:对全体key,基于LFU算法进行淘汰
- volatile-lfu:对设置TTL的key,基于LFU算法进行淘汰
设置方法:
maxmemory-policy noeviction
默认为noeviction
LRU(Least Recently Used),最少最近使用的,用当前时间减去最后一次访问时间,这个值越大淘汰的优先级就越高
LFU(Least Frequently Used),最少频率使用的。会统计每个key的访问效率,值越小淘汰优先级越高
LFU的访问次数之所以叫做逻辑访问此时,是因为并不是每次key被访问都可以技术,而是通过运算:
- 生成0~1之间的随机数R
- 计算1/(旧次数* lfu_factor +1) ,记作P,lfu_log_factor默认为10;
- 如果R<P,则计时器+1,最大不超过255
- 访问次数都会随着时间衰减,距离上一次访问时间每隔lfu_decay_time(默认为1),计数器-1