2026/10/17 8:15:25

【Redis进阶篇|第九篇】redis的内存淘汰策略

【Redis进阶篇|第九篇】redis的内存淘汰策略 1. 引言Redis 作为一款高性能的内存数据库其数据全部存储在内存中。当内存使用量达到上限时Redis 需要采取一定的策略来淘汰部分数据以保证服务的正常运行。本文将详细介绍 Redis 的内存淘汰机制、常见策略及其适用场景。2. 为什么需要内存淘汰策略Redis 默认情况下可以无限使用服务器内存但当内存达到物理内存上限时操作系统会使用交换分区Swap导致 Redis 性能急剧下降。因此合理配置内存上限和淘汰策略至关重要。我们要清理掉无用的缓存提高我们系统的运行速度。通过设置maxmemory参数可以限制 Redis 最大可用内存。当实际内存超过该限制时Redis 会根据配置的淘汰策略maxmemory-policy来决定如何处理新写入请求。3. 内存淘汰策略分类Redis 提供了多种内存淘汰策略主要分为「不淘汰」和「主动淘汰」两大类。主动淘汰策略又根据是否考虑访问频率LRU/LFU以及作用范围全库/设置了过期时间的键进行细分。3.1 不淘汰策略noeviction默认策略。当内存达到上限时新写入操作会返回错误但读操作和删除操作不受影响。适用于数据不可丢失、必须保证写入成功的场景。这个策略很少的运用在我们的业务中一般的业务都会需要去清理掉过期的键。3.2 基于 LRU 的淘汰策略LRULeast Recently Used最近最少使用算法根据数据的访问时间进行淘汰优先移除最久未被访问的键。这个策略是一个很好的办法因为很少访问的键实际上需求也很小那么此时将这个键移除的话即使后面需要用到这个那也是很小的概率去数据库中查找也不会消耗太多的性能这样一来就可以把内存留给真正需要的部分。allkeys-lru在所有键中按照 LRU 算法淘汰不区分是否设置了过期时间。volatile-lru仅在设置了过期时间的键中按照 LRU 算法淘汰。适用于需要保留未设置过期时间的长期数据、只淘汰临时数据的场景。3.3 基于 LFU 的淘汰策略LFULeast Frequently Used最不经常使用算法根据数据的访问频率进行淘汰优先移除访问次数最少的键。Redis 4.0 开始支持该策略。这个本质上和LRU淘汰策略是一样的都是基于使用的时间或者频率来进行决定的。allkeys-lfu在所有键中按照 LFU 算法淘汰。volatile-lfu仅在设置了过期时间的键中按照 LFU 算法淘汰。3.4 随机淘汰策略这个方法在我们的业务中基本上用不到随机淘汰是不可控的我们的业务是比较复杂的并不是单一的业务有一些键是很重要的我们要一直保留随机淘汰则会删除掉这个键导致后面出现一系列问题因此在实际中我们更倾向于更可控的一个方法去清理内存。allkeys-random在所有键中随机淘汰。volatile-random仅在设置了过期时间的键中随机淘汰。3.5 基于过期时间的淘汰策略volatile-ttl仅在设置了过期时间的键中优先淘汰剩余生存时间TTL最短的键。这个方法也是一个很好的方法但是如果单独使用的话则会出现很多问题比如现在有一个人正在进行秒杀活动他此时抢到了这个线程他在线程结束的最后一秒准备下单的时候突然他被清理了那么此时就会出现所谓的bug这是我们需要考虑并且在实际生产中进行避免的一个东西。4. 策略对比与选择建议策略作用范围淘汰依据适用场景noeviction全部键不淘汰数据不可丢失内存充足allkeys-lru全部键最近访问时间缓存热点数据淘汰冷数据volatile-lru设置了过期时间的键最近访问时间保留长期数据淘汰临时缓存allkeys-lfu全部键访问频率访问频率差异明显的场景volatile-lfu设置了过期时间的键访问频率临时数据按频率淘汰allkeys-random全部键随机数据访问均匀无热点volatile-random设置了过期时间的键随机临时数据随机淘汰volatile-ttl设置了过期时间的键剩余 TTL优先淘汰即将过期的数据5. 配置与实战在 Redis 配置文件redis.conf中可以通过以下参数进行配置# 设置最大内存为 256MB maxmemory 256mb 设置淘汰策略为 allkeys-lru maxmemory-policy allkeys-lru 设置采样数量默认 5影响 LRU/LFU 近似算法的精度 maxmemory-samples 5也可以通过命令行动态修改# 连接 Redis 后执行 127.0.0.1:6379 CONFIG SET maxmemory 256mb 127.0.0.1:6379 CONFIG SET maxmemory-policy allkeys-lru6. 注意事项Redis 的 LRU 和 LFU 算法是近似实现通过采样maxmemory-samples来降低性能开销并非严格的全量排序。当设置了过期时间的键被淘汰时会触发键过期事件通知如果开启了notify-keyspace-events。如果所有可淘汰的键都被移除后内存仍然超限Redis 会退化为noeviction行为拒绝新写入请求。建议根据业务特点选择合适的策略缓存场景优先考虑allkeys-lru或allkeys-lfu需要保留长期数据的场景可考虑volatile-lru或volatile-ttl。7. 总结Redis 的内存淘汰策略是保障服务稳定运行的关键机制。合理配置maxmemory和maxmemory-policy结合业务的数据访问特征选择合适的淘汰算法可以有效提升缓存命中率避免内存溢出和性能退化。在实际生产环境中建议通过监控工具观察淘汰键的数量和命中率变化持续优化策略配置。