Redis内存占用率过高问题排查
若使用了Redis的应用程序没有业务量或并发量的突然爆发,在常规情况下Redis内存占用率越来越高并有爆满的趋势,此时应立即排查原因。当感觉在处理完成之前Redis内存就会占满时,应果断采用增加内存等硬件升级方式先扩容后再排查。此类问题从Redis中目前有多少键、各键占用多大空间着手,从而判断是哪个应用程序哪段源程序在使用Redis方面有问题。
快速回想哪些应用程序使用了Redis、源程序中使用Redis存储了哪些数据、各数据的过期时间多久等等,但通常临时很难想起诸多细节。若在开发应用程序时,增加了Redis调用的跟踪或统计日志,可以用这些日志作为参考,这些日志功能通常短时间无法开发完成。
那么从Redis运行日志着手呢?恐怕也难以统计,所以先找找Redis的GUI管理工具,有内存占用分析功能的Redis GUI管理工具。四处搜索找到了Redis Insight这款软件WEB工具(当然可能还有其它满足需求的工具),它可以分析Redis内存占用情况,官网:https://redis.com/redis-enterprise/redis-insight/。
安装好后双击运行会自动打开浏览器,添加Redis连接信息并连接,然后依次点击Memory Analysis->Overview。Offline Analysis离线分析是通过rdb备份文件来分析(适用于无法直接连接生产环境Redis),Online Analysis在线分析是直接访问Redis服务器来分析,两种方式都可以。
分析完成后通过Overview菜单查看各数据类型键的内存占用量和数目、以及各有效期区间的键数量,通过该功能大致分析键是否过多、某些键是否占用过高内存、某些键是否有效期太长。然后点击菜单Memory Analyzor查看所有具体键,默认按内存占用率降序排列。
(1)若键过多,查看具体是哪些前缀的键过多,检查源程序是否可以删除不必要的键;
(2)若某些键过大,查看具体是哪些前缀的键过大,检查源程序是否可以压缩或是否未及时消费而堆积;
(3)若某些键有效期过久,查看具体是哪些前缀的键有效期过久,检查源程序是否可以缩短有效期。
倘若不用工具,那还可以直接使用redis-cli命令行工具或其它命令行工具,通过命令直接查询Redis的键数目、内存占用量、有效期等信息,例如redis-cli的KEYS命令等。