redis引发的一次生产事故,内存爆满

redis引发的一次生产事故

问题描述:

  • 发版后回归测试,不定时出现token失效,导致自动退出到登录界面。
  • 如果操作的人员较多,token失效的就比较快,操作的人员较少token失效的相对较慢。

问题复现:

  • 同一账号多人操作:很快就会出现token失效
  • 不同账号多人操作:很快就会出现token失效
  • 单个账号操作:较长时间出现token失效

问题排查:

  • 检查和token相关的一系列配置,查看是否配置问题
  • token的有效时长:设置的是48小时-----正常
  • 是否允许多个登录:设置允许多方登录-----正常
  • token是存储于redis缓存中的,重新登录,检查生成的token是否正常存储于redis。redis中新生成的token的过期时间是48小时左右,所以可以排除自身到期淘汰的原因。
  • 让开发人员检查代码中是否有token相关的操作。
  • 都不是这些原因,所有能想到的都已经排除了,真的头大。
  • 再次让业务人员一起操作,然后我也登录,记录自己的token ,redis中token信息一切正常,再次退出登录的时候发现redis中这个token也消失了。
  • 这时候可以确定 是redis中的token丢失而导致失效,从而退出登录。
  • 至于为什么会丢失,还是没有头绪。

确认原因

  • 然后问了下运维同事,帮忙看看redis有什么特殊的情况,这一看就有结果了:redis内存基本快满了,而且没有做预警,大家都不知道。

  • 查了下有什么大key或者热key占用了这么多的内存

  • 在这里插入图片描述

  • 发现系统中另一个服务占用了redis极大的内存,如下

  • 在这里插入图片描述

  • 这个服务是公司基础架构的服务,里面的功能日志是通过redis模式传输的,然后在读取redis落库以达到异步解耦。落库成功就会删除redis, 而且有个定时任务负责落库,删除redis。而我们因为不了解细节 没有启用这个定时任务(也可以说压根不知道这玩意的存在),才导致了这个结果。

  • 为什么就不能设置一个过期时间呢,为什么!

  • 直接让运维同事删除这些缓存,然后多人操作系统 再试试是否会出现token失效,结果是一切正常,也不会退出登录了。

为什么

  • redis内存不足,为什么会删除我的数据而不是报写入错误呢

  • 这个就和redis的内存淘汰策略有关了, redis默认的淘汰策略是noeviction 不淘汰数据,新增或者修改操作抛异常,而我们的环境设置的是volatile-lru

  • redis是内存工具,所以在内存快要用完的时候,怎么去取舍已存入的数据和即将要存入的数据,redis官方提供了8种淘汰策略,配置是maxmemory-policy

  • 所有的策略如下

  • volatile-lru:在设置过期时间的数据中淘汰最少使用的数据。

  • allkeys-lru:在所有的数据中淘汰最少使用的数据。

  • volatile-lfu:在设置过期时间的数据中淘汰使用频率最低的数据。

  • allkeys-lfu:在所有的数据中淘汰使用使用频率最低的数据。

  • volatile-random:在设置过期时间的数据中淘汰任意随机数据。

  • allkeys-random:在所有的数据中随机淘汰数据。

  • volatile-ttl:在设置过期时间的数据中淘汰最早过期的数据。

  • noeviction:默认策略,不淘汰数据,新增或者修改数据会抛异常,但是读操作正常进行,不受影响

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jayues_lies

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值