首页 短视频

Redis 缓存爆满?资深架构师带你彻底搞懂缓存淘汰策略

分类:短视频
字数: (0306)
阅读: (9065)
内容摘要:Redis 缓存爆满?资深架构师带你彻底搞懂缓存淘汰策略,

在互联网高并发场景下,Redis 作为高性能缓存被广泛使用。然而,随着业务的不断发展,数据量的持续增长,Redis 的缓存空间终将会面临耗尽的问题,也就是我们常说的 “Redis 的零食盒满了怎么办?”。如果不加以控制,不仅会影响缓存的命中率,甚至可能导致 Redis 服务崩溃,进而影响整个应用的性能。本文将深入探讨 Redis 的缓存淘汰策略,并结合实际案例,帮助你选择最适合你的业务场景的策略。

Redis 缓存淘汰策略:知己知彼,百战不殆

Redis 提供了多种缓存淘汰策略(也称为 eviction policies),当内存使用达到 maxmemory 限制时,Redis 会根据配置的策略来删除部分 key,从而保证新数据的写入。理解这些策略的原理和适用场景至关重要。

常见的 Redis 缓存淘汰策略

  • noeviction (默认策略):当内存达到限制时,直接返回错误。这意味着新的写入操作将失败。这种策略通常用于不希望 Redis 自动删除任何数据的场景。
  • allkeys-lru:从所有 key 中移除最近最少使用的 key (Least Recently Used)。这是最常用的淘汰策略之一,它假设最近被访问的数据在未来也更有可能被访问。类似于操作系统中经典的页面置换算法 LRU。
  • volatile-lru:从设置了过期时间的 key 中移除最近最少使用的 key。只针对设置了 TTL (Time To Live) 的 key 进行淘汰,如果所有 key 都没有设置过期时间,则相当于 noeviction 策略。
  • allkeys-random:从所有 key 中随机移除 key。适用于对数据访问模式没有特定规律的场景,或者当其他策略的性能差异不明显时。
  • volatile-random:从设置了过期时间的 key 中随机移除 key。同样只针对设置了 TTL 的 key 进行淘汰。
  • volatile-ttl:从设置了过期时间的 key 中,移除剩余生存时间 (TTL) 最短的 key。这种策略适用于希望尽快清理掉即将过期的数据的场景。
  • allkeys-lfu:从所有 key 中移除最不经常使用的 key (Least Frequently Used)。LFU 策略会记录每个 key 的访问频率,并优先淘汰访问频率最低的 key。相较于 LRU,LFU 更能抵抗偶发性访问带来的干扰,但实现复杂度也更高。
  • volatile-lfu:从设置了过期时间的 key 中移除最不经常使用的 key。同样只针对设置了 TTL 的 key 进行淘汰。

如何选择合适的淘汰策略?

选择合适的淘汰策略需要结合你的业务场景和数据访问模式。以下是一些建议:

Redis 缓存爆满?资深架构师带你彻底搞懂缓存淘汰策略
  • 如果你的应用对缓存的命中率要求非常高,并且数据访问模式符合 LRU 假设,那么 allkeys-lru 是一个不错的选择。
  • 如果你的数据具有不同的生命周期,并且希望优先清理掉即将过期的数据,那么 volatile-ttl 策略可能更适合你。
  • 如果你的数据访问模式比较随机,或者你对缓存淘汰策略的性能要求不高,那么 allkeys-random 或 volatile-random 策略也是可以考虑的。
  • 如果你的 Redis 主要用作持久化存储,并且不希望自动删除任何数据,那么 noeviction 策略是唯一的选择。
  • 如果希望尽可能地保留经常访问的数据,减少偶发性访问造成的干扰,可以考虑使用 allkeys-lfu 或 volatile-lfu 策略。但需要注意 LFU 策略的实现复杂度较高,可能会带来一定的性能开销。

Redis 配置缓存淘汰策略:手把手教你配置

你可以通过 Redis 的配置文件 (redis.conf) 或者使用 CONFIG SET 命令来配置缓存淘汰策略。

通过 redis.conf 文件配置

找到 redis.conf 文件,搜索 maxmemory-policy 配置项,将其设置为你希望使用的策略。例如,要使用 allkeys-lru 策略,可以这样设置:

Redis 缓存爆满?资深架构师带你彻底搞懂缓存淘汰策略
maxmemory-policy allkeys-lru

修改配置文件后,需要重启 Redis 服务才能生效。

通过 CONFIG SET 命令动态配置

你也可以使用 CONFIG SET 命令在运行时动态地修改缓存淘汰策略。例如,要将策略修改为 volatile-ttl,可以这样操作:

Redis 缓存爆满?资深架构师带你彻底搞懂缓存淘汰策略
CONFIG SET maxmemory-policy volatile-ttl

使用 CONFIG SET 命令修改的配置会立即生效,无需重启 Redis 服务。

监控和调整:让你的缓存策略更智能

合理设置 maxmemorymaxmemory-policy 只是第一步。为了确保 Redis 的性能和稳定性,还需要定期监控缓存的命中率、内存使用情况,并根据实际情况调整配置。可以使用 Redis 的 INFO 命令来获取这些信息。

Redis 缓存爆满?资深架构师带你彻底搞懂缓存淘汰策略

例如,INFO stats 命令可以查看缓存命中率:

INFO stats

通过监控 keyspace_hitskeyspace_misses 指标,可以计算出缓存命中率。如果命中率过低,可能需要调整缓存淘汰策略,或者增加 Redis 的内存容量。

实战避坑:那些年踩过的坑

  • 不要盲目选择默认策略 (noeviction)。 在生产环境中,一定要根据业务场景选择合适的缓存淘汰策略。否则,当内存耗尽时,Redis 会拒绝所有写入操作,导致应用崩溃。
  • 合理设置 maxmemory maxmemory 的值应该根据 Redis 服务器的可用内存和业务需求来确定。设置过小会导致频繁的缓存淘汰,影响性能;设置过大可能会导致 Redis 占用过多的内存,影响其他应用的运行。
  • 注意 volatile 策略的适用场景。 volatile 策略只对设置了过期时间的 key 生效。如果你的所有 key 都没有设置过期时间,那么 volatile 策略将不起作用。
  • 小心 LFU 策略的性能开销。 LFU 策略需要维护每个 key 的访问频率,这会带来一定的性能开销。在高并发场景下,需要 carefully 评估 LFU 策略的性能影响。
  • 利用 Redis 的过期时间 (TTL) 功能。 为 key 设置合适的过期时间可以有效地控制缓存的生命周期,避免缓存雪崩等问题。可以通过 EXPIRE 命令设置 key 的过期时间。
EXPIRE mykey 60  # 设置 mykey 的过期时间为 60 秒
  • 结合 Nginx 进行多级缓存。 Redis 缓存前端通常会搭配 Nginx 进行反向代理和负载均衡。可以在 Nginx 上配置缓存,利用 Nginx 的缓存能力减轻 Redis 的压力,提高整体性能。可以使用 proxy_cache_path 指令配置 Nginx 的缓存路径,并使用 proxy_cache 指令启用缓存。同时,合理设置 proxy_cache_valid 指令,控制缓存的有效期。Nginx 的并发连接数也需要根据实际访问量进行调整,可以使用 worker_connections 指令进行配置。如果使用了宝塔面板,可以在面板中直接配置 Nginx 的缓存和并发连接数,简化操作。

理解并灵活运用 Redis 的缓存淘汰策略,是构建高性能、高可用性应用的关键。希望本文能帮助你更好地理解 Redis 的缓存机制,并解决实际应用中遇到的问题。

Redis 缓存爆满?资深架构师带你彻底搞懂缓存淘汰策略

转载请注明出处: 代码一只喵

本文的链接地址: http://m.acea4.store/blog/205404.SHTML

本文最后 发布于2026-04-15 17:12:48,已经过了12天没有更新,若内容或图片 失效,请留言反馈

()
您可能对以下文章感兴趣
评论
  • 秃头程序员 2 天前
    Nginx 那部分讲得也很实用,多级缓存确实可以有效缓解 Redis 的压力!
  • 草莓味少女 2 天前
    感谢分享!我最近刚好在优化 Redis 缓存,这篇文章给了我很多启发。准备尝试一下 allkeys-lfu 策略。
  • 摸鱼达人 1 天前
    讲得太透彻了!之前一直对 volatile-lru 和 allkeys-lru 的区别有点模糊,这篇文章一下子就清晰了。
  • 干饭人 5 天前
    请问作者,如果我的 key 有的设置了过期时间,有的没设置,那我应该选择哪种策略比较好?