记一次redis内存没满发生key逐出的情况。

现象
从监控上看,redis的内存使用率最大是80%,但是发生了key evicted

记一次redis内存没满发生key逐出的情况。_第1张图片

分析
原因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

你可能感兴趣的:(redis,redis,数据库,缓存)