本文正在参与「金石方案 . 瓜分6万现金大奖」

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:默许战略,不筛选数据,新增或许修改数据会抛反常,但是读操作正常进行,不受影响

所以关于redis的运用需要当心,

避免写入没有过期时刻的数据!即使一定要存入永久数据,也要预估数据的大小,判别是否会随着时刻不断添加!添加内存监控,设置报警阈值,提早发现问题。

我是纪先生,用输出倒逼输入而继续学习,继续共享技能系列文章,以及全网值得收藏好文,欢迎重视大众号,做一个继续生长的技能人。