面试官:了解redis数据淘汰策略吗?
就是当Redis内存使用达到设置的上限时, 此时需要使用redis数据淘汰机制来进行数据淘汰。(有针对key的 和 针对value数据的)
Redis支持8种不同策略来选择要删除的key:
- noeviction: 不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略。
- volatile-ttl: 对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰
- allkeys-random:对全体key ,随机进行淘汰。也就是直接从db->dict中随机挑选
- volatile-random:对设置了TTL的key ,随机进行淘汰。也就是从db->expires中随机挑选。
- allkeys-lru: 对全体key,基于LRU算法进行淘汰
- volatile-lru: 对设置了TTL的key,基于LRU算法进行淘汰
- allkeys-lfu: 对全体key,基于LFU算法进行淘汰
- volatile-lfu: 淘汰最少使用(最近最不常用)的键值;
比较容易混淆的有两个:- LRU(Least Recently Used),最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
- LFU(Least Frequently Used),最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。
● LRU算法
○ 维护一个双向链表,用于顺序存储被访问过的key。在访问数据时,最新访问过的key将被移动到表头,即最近访问的key在表头,最少访问的key在表尾。
● 近似LRU算法(Redis)
○ 给每个key维护一个时间戳,淘汰时随机采样5个key,从中淘汰掉最旧的key。如果还是超出内存限制,则继续随机采样淘汰。
○ 优点:比LRU算法节约内存 只对少量key进行取样(LRU算法需要把每一个key都存下来维护一个链表),却可以取得非常近似的效果
● LFU算法
○ Redis4.0 引入。 根据数据访问频次 淘汰最近访问次数最低的数据