zoukankan      html  css  js  c++  java
  • 转载: 记一次开发环境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没有再出现丢失。

  • 相关阅读:
    svn: E120106: ra_serf: The server sent a truncated HTTP response body.
    HTTP method POST is not supported by this URL解决
    TinyOS文件结构清单解析
    Crush Course 神话学笔记
    Django 入门
    Crush Course 心理学笔记
    网络相关知识汇总链接
    9.21 小程序开发培训讲座
    论文简读之LAIA
    Android studio 的那些坑
  • 原文地址:https://www.cnblogs.com/ifme/p/12689704.html
Copyright © 2011-2022 走看看