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内存消耗的风险。

posted @ 2018-04-03 17:39  51QA  阅读(7160)  评论(0编辑  收藏  举报