zoukankan      html  css  js  c++  java
  • redis内存溢出问题分析和后续规避方法

    【bug描述】

    【步骤】

    1、【前置:当前时间是2018年2月6日】用户A登录客户端A,用户A登录客户端B,查看客户端账号被踢出登录时的弹窗时间显示8月24日,时间显示错误。
    2、【前置:该弹窗提示平台已经屏蔽】消息列表点击任意群聊,进入群聊对话窗提示:“XX项目升级,部分功能暂停使用,敬请谅解”。

    【实际结果】:
    1、【前置:当前时间是2018年2月6日】账号被踢出登录时的弹窗时间显示8月24日,时间显示错误。
    2、【前置:该弹窗提示平台已经屏蔽】进入群聊对话窗提示:“云企信升级,部分功能暂停使用,敬请谅解”。

    【预期结果】:
    1、【前置:当前时间是2018年2月6日】账号被踢出登录时的弹窗时间显示当前时间,时间显示正确。
    2、【前置:该弹窗提示平台已经屏蔽】进入群聊对话窗不提示:“云企信升级,部分功能暂停使用,敬请谅解”。


    【问题来源】:用户反馈

    【版本】:V1.8.0版本

    【反馈时间】:2018年2月6日

    【bug分析】

    1、 为什么当前时间是2018年2月6日,账号被踢出登录时的弹窗时间显示8月24日,时间显示错误?

    现网 8月份之后由运维接管,缓存数据库(redis)未配置持久化,数据存储在缓存中,redis服务重启后缓存数据丢失,业务只能读取到8月份的持久化数据。6号上午由于redis内存溢出,增大配置内存后重启缓存数据丢失,数据错乱,导致平台下发错误的消息。

    2、 为什么该弹窗提示平台已经屏蔽,进入群聊对话窗提示:“云企信升级,部分功能暂停使用,敬请谅解”?
    现网 8月份之后由运维接管,缓存数据库(redis)未配置持久化,数据存储在缓存中,redis服务重启后缓存数据丢失,业务只能读取到8月份的持久化数据。6号上午由于redis内存溢出,增大配置内存后重启缓存数据丢失,导致标志位被覆盖,下发错误状态。

    3、 什么是redis持久化?持久化和非持久化区别?
    Redis配置中可配置持久化策略,默认900s内有1个更改,300秒有10个更改等。配置开关默认打开,若关闭(非持久化),数据只存储缓存中,若打开,数据将按配置策略落地到磁盘。重启服务后,缓存中的数据将丢失。

    4、 redis数据库内存溢出触发因素?
    老模块考勤每天定时把所有企业的用户数据写入redis,数据量较大,同时现网redis未做内存监控。

    5、 账号登录跟redis的缓存关系,存了什么数据在redis?
    redis存储了用户的token、设备id、验证码信息等。用户token登录时,会首先校验用户的设备,若终端入参的设备id与token不一致,平台认为用户更换了设备,会下发通知。

    6、 如何规避redis数据库内存溢出风险?
    ①消耗内存的模块需尽快改造或停止,业务中使用redis需设置有效时间。②现网针对基础软件服务的监控(磁盘、内存等)需完善。③开发设计评审时关注开发模型对redis的写频率,以及消耗大小,评估对redis内存消耗的风险。



    【经验总结】
    1、后续测试中,业务中涉及到redis,提醒开发需要设置有效时间,消耗内存的模块需尽快改造或停止,现网针对基础软件服务的监控(磁盘、内存等)需要完善,开发设计评审时关注开发模型对redis的写频率,以及消耗大小,评估对redis内存消耗的风险。

  • 相关阅读:
    在现有项目中使用AspNet Identity 2.0 实战
    SQL 带自增长列的表的插入
    在C++中子类继承和调用父类的构造函数方法
    C++继承
    C++中重载、重写(覆盖)和隐藏的区别实例分析
    C++类
    C++中头文件(.h)和源文件(.cpp)都应该写些什么
    C++模板
    C语言字符串操作总结大全
    C++ 标准模板库(STL)
  • 原文地址:https://www.cnblogs.com/51QA/p/8709959.html
Copyright © 2011-2022 走看看