现象:
从监控上看,redis的内存使用率最大是80%,但是发生了key evicted
分析:
原因1、可能是阿里云监控没抓取到内存100%监控数据。
阿里控制台监控监控粒度是5秒。
内存使用率的计算方法。
used_memory_human/maxmemory
原因2、可能是link 内存占用比较大,虽然总内存超过了,maxmemory但是,link内存没统计到内存使用率里。
结合当时业务情况:没有大量数据写入, 有大key访问最大key 4M,hgetall访问。
所以判断,第二种可能性比较大。
解决方案:研发把大key 分散成小key。 比如原来存储了全国的数据,现在改成一个城市一个key。
redis 内存分析。
Redis总内存 = 链路内存(动态)+ 数据内存+ 管理内存(静态)
链路内存(动态)
主要包括Input Buff、Output Buff、JIT Overhead、Fake Lua Link、Lua执行缓存等,例如可执行INFO命令,通过返回结果的Clients中查看客户端缓存信息。
说明
Input buff与Output buff与每个客户端的连接有关,通常较小。当执行客户端Range类操作或大Key收发较慢时,Input buff与Output buff占用的内存会增大,从而影响数据区,甚至会造成内存溢出OOM(Out Of Memory)。
数据内存
用户数据区,即实际存储的Value信息,通常作为重点分析的对象。
管理内存(静态)
启动时较小且相对恒定,该区域由管理数据的Hash内存开销、Repl-buff与aof-buff的内存开销(约32 MB~64 MB)等构成。
说明
当Key数量特别多时(例如几亿个),会占用较大的内存。
内存使用率突然升高的主要原因如下:
- 短时间内大量写入新数据。
- 短时间内大量创建新连接。
- 突发访问产生大量流量超过网络带宽,导致输入缓冲区和输出缓冲区积压。
- 客户端处理速度跟不上Redis的处理速度,导致输出缓冲区积压。
redis内存解释
https://www.jianshu.com/p/2e75ce35261e
https://help.aliyun.com/zh/redis/user-guide/troubleshoot-the-high-memory-usage-of-an-apsaradb-for-redis-instance?spm=a2c4g.11186623.0.i42