- 面试官询问缓存过多而内存有限时内存被占满的处理办法,引出 Redis 数据淘汰策略。
数据淘汰策略与数据过期策略不同,
过期策略针对设置过期时间的 key 删除,
淘汰策略是在内存不够时按规则删除内存数据。
八种数据淘汰策略介绍
- no evision(默认策略):新key到来不淘汰,内存满不允许写入新数据。
- volatile - ttl:对设置过期时间的key,比较剩余过期时间,剩余时间短的优先淘汰。
- allkeys random:适用于所有key,随机淘汰数据。
- volatile - random:针对设置过期时间的key随机淘汰。
- allkeys - lru:基于LRU算法淘汰所有key,LRU指最近最少使用,用当前时间减去最后访问时间,值越大淘汰优先级越高。
- volatile - lru:对设置过期时间的key基于LRU算法淘汰。
- allkeys - lfu:基于LFU算法淘汰所有key,LFU是最少频率使用,统计每个key访问频率,值越小淘汰优先级越高。
- volatile - lfu:对设置过期时间的key基于LFU算法淘汰。
- LRU和LFU概念重点讲解
- LRU主要统计时间,LFU主要统计访问频率,理解二者概念和区别在面试中很重要,不一定要记住八种策略,但要掌握这两个概念。
- 策略使用建议
- 业务无要求或无明显冷热区分,优先建议使用allkeys - lru,利用算法优势保留最近常访问数据,因为访问频率不一定能准确反映数据热度。
- 业务中数据访问频率差别不大,无明显冷热数据区分,可使用allkeys random或volatile - random随机删除数据。
- 业务中有置顶需求,使用volatile - ttl,置顶数据不设置过期时间可一直不被淘汰。
- 业务中有短时高频访问数据,建议使用allkeys - lfu或volatile - lfu。
- 面试中相关问题及应对方法
- 对于数据库数据多而Redis存储有限时保证热点数据的问题,可使用allkeys - lru策略淘汰最近最少使用数据。
- Redis内存用完后的情况取决于使用的淘汰策略,如默认的no evision会直接报错。