在生产环境中使用Redis时,内存配置、过期键清理和缓存淘汰策略是开发者绕不开的核心问题。下面围绕几个常见疑问展开:Redis内存应该设置多大?如何查看和修改内存配置?内存满了之后会发生什么?定期删除和惰性删除该如何选择?缓存淘汰策略又该如何挑选? 生产上Redis内存需要设置多少才合适 如何配置、
在生产环境中使用Redis时,内存配置、过期键清理和缓存淘汰策略是开发者绕不开的核心问题。下面围绕几个常见疑问展开:Redis内存应该设置多大?如何查看和修改内存配置?内存满了之后会发生什么?定期删除和惰性删除该如何选择?缓存淘汰策略又该如何挑选?
这些问题几乎是每个Redis使用者都会遇到的坎。下面从内存设置说起。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
maxmemory
打开Redis配置文件,找到maxmemory参数,注意单位是字节,需要换算一下。
127.0.0.1:6379>config get maxmemory
返回结果常常是0。这时候你会不会好奇:默认内存是0,那之前的数据怎么存进去的?
如果不设置maxmemory,或者把它设为0,在64位操作系统下,Redis不限制内存使用;在32位操作系统下,最多只能用到3GB。注意,64位系统下0就是“不限制”,但生产上可不能这样放任。
一般生产上你如何配置
业界推荐的做法是:将Redis内存设置为物理内存的3/4左右。比如服务器有16GB内存,预留4GB给系统和其它进程,Redis用12GB比较稳妥。当然还要结合具体业务场景和数据量来调整。
maxmemory 1056236
127.0.0.1:6379>config set maxmemory 104856986
查看Redis内存使用命令
127.0.0.1:6379>info memory127.0.0.1:6379>config get maxmemory
设置了maxmemory后,一旦数据量达到上限,如果还有键没有过期时间,写入就会报错。所以必须搭配内存淘汰策略来用。
一个键过期了,是不是到期立刻就被删除了?答案是否定的。那到底什么时候删?怎么删?Redis提供了三种删除策略。
立即删除保证过期键在到期后马上被清理,内存释放最及时。但代价是对CPU极不友好——如果正好赶上CPU在做计算密集型操作(比如交集、排序),删键操作会额外抢占时间片,相当于让CPU一边忙业务一边不停地打扫卫生。总结起来就是:用处理器性能换存储空间,拿时间换空间。
过期了?先不管。等下次有人访问这个键时,如果发现已经过期,就顺手删掉,并返回不存在。这种方式对内存极其不友好——过期键可能一直赖在内存里,永远没人访问,它们就像内存泄漏一样占着茅坑不拉屎。除非手动执行FLUSHDB,否则这些垃圾数据会堆积起来。总结:用存储空间换处理器性能,拿空间换时间。如果要启用惰性删除的淘汰模式,可以设置lazyfree-lazy-eviction=yes。
定期删除是前两种的折中方案:每隔一段时间执行一次删除操作,通过限制执行时长和频率来减少对CPU的影响。Redis默认每100毫秒检查一次,但注意——它不是把全部key都翻一遍,而是随机抽查。如果每隔100ms把所有key扫一遍,Redis早就进ICU了。具体做法是周期性轮询,采用随机抽取的策略,再根据过期键占比动态调整删除频度。
特点1:CPU压力有峰值,但检测频度可以自定义。
特点2:内存压力不算大,长期未被访问的冷数据会被逐步清理。
难点:定期删除的执行频率和时长需要精心调优。太频繁或时间太长,就退化成定时删除,CPU扛不住;太稀疏或时间太短,又和惰性删除一样造成内存浪费。
到这里,你可能已经发现问题了——定期删除时,有的key可能老被抽查到,但有的key可能永远抽不到;惰性删除时,那些过期却没人访问的键也一直活着。大量过期键堆积在内存里,Redis内存空间迟早被撑爆。
在Redis配置文件(redis.conf)的MEMORY MANAGEMENT部分,可以找到相关设置。

简单说一下这两个容易混淆的概念:
LRU(Least Recently Used):淘汰最长时间未被使用的页面,看的是页面最后一次被访问的时间,优先淘汰那个最久没被碰过的。
LFU(Least Frequently Used):淘汰一定时期内被访问次数最少的页面,看的是频次。例如,十分钟内页面2被访问了5次,页面3只被访问了1次,那么LFU会淘汰页面3,而LRU则可能淘汰页面1(假如页面1是十分钟前被访问的,更久远)。
两者的核心区别:LRU看“最后一次访问距现在多久”,LFU看“一段时间内被访问了多少次”。
总结一下就是:2个维度(过期键筛选 vs. 全键筛选),4种算法(LRU、LFU、random、ttl),组合起来正好8个选项。
如果你的数据访问模式是典型的热点数据(少量key被频繁访问),推荐allkeys-lru,因为它能有效保留热门数据。如果所有key被访问的概率差不多,可以选择allkeys-random。如果你对每个key的过期时间把握得很准,可以考虑volatile-ttl。
下面是一些具体场景下的建议:
选择淘汰策略时,还要考虑以下几点:
在redis.conf中用maxmemory-policy指令指定。例如:
maxmemory-policy allkeys-lru
启动时也可以通过命令行指定:
redis-server --maxmemory-policy allkeys-lru
运行时动态修改(重启后失效):
CONFIG SET maxmemory-policy allkeys-lru
光设一个策略还不够,下面这些优化点值得关注:
maxmemory不要超过物理内存,避免触发OS swap。maxmemory-samples控制LRU/LFU采样精度,数值越大精度越高,CPU开销也越大。INFO memory查看内存使用情况,评估策略效果。从内存配置到过期键删除,再到淘汰策略的选择,每一步都影响Redis的稳定性和性能。生产环境中没有银弹,结合业务特点做合理配置才是正道。希望这篇梳理能帮你避开一些常见的坑。