转载: 记一次开发环境redis出现key丢失排查
原文记一次开发环境redis出现key丢失排查
背景:
开发环境大家共用redis
集群, 出现设置的redis key
随机丢失
1. 检查key是否设置了过期时间
执行ttl key
发现值是-1,并没有设定过期时间
2. 检查是否有人删除key
,或者flushdb
,flushall
执行info commandstats
cmdstat_XXX: calls=XXX,usec=XXX,usec_per_call=XXX
看出命令执行的次数、命令耗费的 CPU 时间(单位毫秒)、执行每个命令耗费的平均 CPU 时间(单位毫秒)
看看del
,flushdb
,flushall
的次数,可能执行的时候已经有大量的调用,先执行config resetstat
进行重置
3. 检查内存配置,是否超出内存设定被回收
1. info命令查看
evicted_keys
: 因最大内存容量限制而被驱逐(evict)的键数量
当时发现evicted keys
值大于0,怀疑内存不够
2. 检查是否设置最大内存
执行CONFIG GET maxmemory
3. 检查内存使用
执行info memory
, 可以看到当前使用内存量,和峰值
4.看到设定了最大内存,内存也将要接近并且曾经的峰值非常大, 那就需要看看设定的淘汰策略
执行config get maxmemory-policy
发现设定的淘汰策略为: allkeys-lru
Redis
提供6种数据淘汰策略:
volatile-lru:从已设置过期时间的内存数据集中挑选最近最少使用的数据 淘汰;
volatile-ttl: 从已设置过期时间的内存数据集中挑选即将过期的数据 淘汰;
volatile-random:从已设置过期时间的内存数据集中任意挑选数据 淘汰;
allkeys-lru:从内存数据集中挑选最近最少使用的数据 淘汰;
allkeys-random:从数据集中任意挑选数据 淘汰;
no-enviction(驱逐):禁止驱逐数据。(默认淘汰策略。当redis内存数据达到)
至此大概率确认是内存不够导致KEY被删除。
列举2种解决方案:
1. 调整合适的策略,内存不足清除过期的key
执行 config set maxmemory-policy volatile-lru
2. 设置更大的内存
CONFIG SET maxmemory XXXX
结果:
调整策略为volatile-lru
后,经过观察,设定的key没有再出现丢失。