Redis性能提升技巧,自动清理内存不求人,缓存自动清空也能轻松搞定
- 问答
- 2026-01-10 02:31:26
- 4
Redis 性能提升技巧,自动清理内存不求人,缓存自动清空也能轻松搞定
想让你的 Redis 跑得更快,同时又不希望内存被无用数据塞满导致服务崩溃?Redis 本身就有不少“自动化”的机制,用好了就能让你事半功倍,真正实现“不求人”,下面我们就来聊聊几个关键技巧。
理解 Redis 的内存都去哪儿了
你得知道 Redis 的内存主要被什么占用,除了你存进去的业务数据(我们称之为键值对)之外,Redis 自身运行也需要一点内存开销,但大头肯定是在你的数据上,如果内存满了,新的数据就写不进去了,或者会触发 Redis 的淘汰机制,可能导致你重要的数据被误删,我们的目标是在内存用满之前,就让 Redis 自动把那些“不那么重要”的数据清理掉。
设置内存上限,这是自动清理的前提
这是最关键的一步,你必须告诉 Redis:“你的内存最多只能用这么多!” 这个配置在 Redis 的配置文件 redis.conf 里,参数叫 maxmemory,你可以设置为 maxmemory 1gb,意思是 Redis 最多使用 1GB 的物理内存。
如果你不设置这个值,在 64 位系统上 Redis 会一直用内存,直到把系统内存吃光,最后可能被操作系统强制杀掉进程,那就不是优雅的清理了,而是灾难性的崩溃,设定 maxmemory 是启用所有自动清理策略的基石。
选择正确的“淘汰策略”,指挥 Redis 清理谁
设定了内存上限后,当内存快达到上限时,Redis 怎么知道该删除哪些数据呢?这就由“淘汰策略”来决定,这个策略同样在 redis.conf 文件中通过 maxmemory-policy 参数配置,以下是几种常用的策略,你可以根据业务场景来选择:
-
volatile-lru(推荐常用):这是最常用的策略之一,它只针对那些设置了过期时间(TTL)的键进行清理,当内存不足时,它会尝试淘汰“最近最少使用”的键,简单说,就是最久没被访问过的、并且会过期的数据优先被删掉,这很适合缓存场景,因为缓存数据本来就有有效期,淘汰旧的很合理。

- 来源:Redis 官方文档关于 maxmemory-policy 的说明
-
allkeys-lru:和上面类似,但范围更广,它会从所有的键中(不管有没有设置过期时间)淘汰最近最少使用的,如果你的数据有一部分是永久有效的,但也有一部分是缓存,这个策略可能更彻底,但要小心别把重要的永久数据给淘汰了。
- 来源:Redis 官方文档关于 maxmemory-policy 的说明
-
volatile-ttl:这个策略很有意思,它不看你用不用,只看谁“活得短”,当内存不够时,它会优先淘汰那些过期时间最短的键,也就是说,反正你马上也要过期了,不如提前送你走,腾出地方,这在某些特定场景下很有效。
- 来源:Redis 官方文档关于 maxmemory-policy 的说明
-
volatile-random / allkeys-random:就是随机淘汰,分别针对带过期时间的键和所有键,这个策略性能开销最小,但因为随机性,可能会删掉重要的数据,一般不太推荐。
-
noeviction:这是默认策略,它比较“霸道”,当内存满了之后,所有会占用更多内存的写命令(set、lpush 等)都会报错,读请求正常,这能保证数据不丢失,但你的服务可能会因为写不进去数据而出现问题,除非你对数据完整性要求极高,否则不建议生产环境使用。
怎么选? 如果你的数据绝大多数都是缓存,用 volatile-lru 准没错,如果你的数据分不清是缓存还是永久存储,但又必须保证服务能继续写入,可以冒险用 allkeys-lru。
善用过期时间,让数据“到点自己走”

除了依赖淘汰策略,更主动的办法是给你存入 Redis 的每一个键都设置一个合理的过期时间,这样即使淘汰策略没触发,数据也会在指定的时间点自动被删除,这叫“惰性删除”和“定期删除”结合机制。
- 惰性删除:当客户端访问一个键时,Redis 会检查它是否过期,如果过期就当场删除,这很好,但有个问题:如果这个键永远不被访问,它就永远占着内存。
- 定期删除:为了解决上面的问题,Redis 会每隔一段时间(默认100毫秒)随机抽取一些设置了过期时间的键,检查并删除其中已过期的,这是一个补偿机制。
给你的缓存数据设置过期时间,是从源头上减少内存压力的最好方法,一条用户会话信息可以设置 30 分钟过期,一条热点新闻数据可以设置 2 小时过期。
警惕“大Key”和“热Key”,它们是性能杀手
自动清理机制能解决内存满的问题,但解决不了性能慢的问题,Redis 明明内存没满,却突然变慢,很可能是遇到了“大Key”或“热Key”。
- 大Key:指的是一个键对应的值非常大,比如一个包含几百万元素的 Hash(哈希表),或者一个长达几兆的 String(字符串),这种 Key 在序列化/反序列化、网络传输、甚至删除时都会非常耗时,可能导致 Redis 服务卡顿,解决办法是拆分大 Key,比如一个大的 Hash 可以按业务维度拆成多个小的 Hash。
- 热Key:指的是某个键在瞬间被极高的频率访问,这个 Key 本身可能不大,但所有的请求都打在这一台 Redis 服务器的一个节点上,会导致该节点 CPU 负载极高,成为瓶颈,解决办法可以考虑使用本地缓存(如 Guava Cache)来缓解,或者通过设计将热 Key 复制多份。
定期检查,做到心中有数
你不能完全当甩手掌柜,可以通过 Redis 自带的 INFO 命令来查看内存使用情况、键的数量、淘汰的键数量等指标,或者使用 redis-cli --bigkeys 命令来扫描当前数据库中最大的 Key,做到心中有数。
提升 Redis 性能、实现自动清理内存的核心三步曲就是:1)设置 maxmemory 上限;2)选择合适的 maxmemory-policy(推荐 volatile-lru);3)为缓存数据普遍设置合理的过期时间。 做好这三点,你的 Redis 缓存就能在大部分场景下稳定、高效地自动运行了。
本文由酒紫萱于2026-01-10发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://www.haoid.cn/wenda/77800.html
