📚 分类
redis
🕵🏽‍♀️ 问题描述
redis的数据淘汰策略是什么?
👨‍🏫 问题讲解
✅ 触发条件
当redis执行写操作时,会检查当前内存使用是否超过 maxmemory:
未超过: 正常执行操作。
已超过: 触发内存淘汰策略,删除部分数据后再执行新操作。

✅ 淘汰策略
redis提供了8种淘汰策略可通过配置 maxmemory-policy 指定(默认 noeviction),分为以下几类:

✔ noeviction: 不淘汰任何key,但是内存满时不允许写入新数据(默认就是这种策略)。
✔ allkeys-random: 对全体key,随机进行淘汰。
✔ allkeys-lru: 对全体key,基于LRU算法进行淘汰。
✔ allkeys-lfu: 对全体key,基于LFU算法进行淘汰。
✔ volatile-random: 对设置了TTL的key ,随机进行淘汰。
✔ volatile-lru: 对设置了TTL的key,基于LRU算法进行淘汰。
✔ volatile-lfu: 对设置了TTL的key,基于LFU算法进行淘汰。
✔ volatile-ttl: 对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰。

✅ LRU 与 LFU 的区别
❒ LRU(Least Recently Used)最近最少使用: 用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
❒ LFU(Least Frequently Used)最少频率使用: 会统计每个key的访问频率,值越小淘汰优先级越高。

✅ 配置方式
maxmemory 100mb      # 设置最大内存(如 100MB)
maxmemory-policy allkeys-lru  # 设置淘汰策略

✅ 策略选择建议
✔ 纯缓存场景(如缓存数据库查询结果):推荐 allkeys-lru 或 allkeys-lfu,优先保留热点数据。
✔ 既有缓存又有持久化数据(部分键需永久保留):推荐 volatile-lru 或 volatile-lfu,仅淘汰临时缓存键。
✔ 对过期时间敏感:如定时任务相关的键,可选择 volatile-ttl,优先淘汰即将过期的键。
✔ 数据不允许丢失:使用默认的 noeviction,但需监控内存使用,避免写操作失败。
🏳️‍🌈 问题总结
✅ 数据淘汰策略

✔ redis提供了8种不同的数据淘汰策略,默认是noeviction不删除任何数据,内存不足直接报错。
✔ LRU: 最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
✔ LFU: 最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。
✔ 平时开发过程中用的比较多的就是allkeys-lru(结合自己的业务场景)。
📖 问题信息
📈 浏览次数:29 | 📅 更新时间:2025-12-04 01:48:23
📦 创建信息
🏷️ ID:9 | 📅 创建时间:2024-10-19 16:58:23