redis占用内存较高排查

现象

发现生产环境上的一台服务器出现内存使用率达到阈值的告警
登上服务器使用 top 命令发现,这台服务器上的 redis实例消耗了大量的内存,而且cpu使用率很高,应该是有应用往 redis 上进行大量的读写操作

定位问题

我们首先看一下任意key的过期时间是多少

# 从当前数据库中随机返回一个 key
127.0.0.1:6379> RANDOMKEY

127.0.0.1:6379> TTL key
(integer) 12032145
# 我们发现,key的过期时间设置成了一千多万秒!这个过期时间也太长了吧

再查看一下 Redis 的内存回收策略配置

127.0.0.1:6379> info memory
maxmemory:0
maxmemory_policy:"noeviction"
# 可以看到,我们没有设置内存最大限制,而且内存回收策略是noeviction,即不淘汰任何键值对

查看了这两个选项之后,问题就清晰起来了:

key的过期时间设置的太长,没有设置最大可用内存限制而且内存回收策略是noeviction 就会使得原先的数据还没过期,又有新的数据写进来,导致消耗内存越来越多,而系统又无法进行回收

解决方法

  1. 重新给键设置过期时间: 这个不太现实,因为生产环境中的 Redis 有大量的 Key,不可能说一个一个的重新设置过期时间
  2. 修改配置文件(推荐使用): 我们可以更改 Redis 的配置,设置最大内存使用限制以及内存回收策略

修改 Redis 配置文件,添加如下两个字段:

maxmemory:10G
maxmemory_policy:"volatile-lru"

我们设置了最大内存使用限制为10G,一旦redis占用内存超过10GB,就会触发内存回收机制volatile-lru,在设置了过期时间的key里,删除最近最少使用的key

更改配置后重启一下,等待一段时间后发现 Redis 消耗的内存降下去了,也不再告警了

posted @ 2025-08-27 21:31  阿峰博客站  阅读(27)  评论(0)    收藏  举报