持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
记录生产环境一次 redis bug。
事情要从两周前开始说起,五月底左右,接到运营同学反映,反馈系统中这两天出现了很多登录过期情况,当时bug反映到我这来了,我马上看了一下代码,拦截器、登录没有错啊,我就回复运营同学,是不是真的是token到期了,自动退出了。过了一天,运营又找上我,说用户在刚登录,没几分钟就提示登录过期了。当时想,是不是redis的事情。
我主要是前端开发,兼写部分后端代码,我就找了我们后端java开发,告诉他让马上看一下。
我自己也搜索了一下。
redis的删除key策略,主要分为下面三种:
- 定时删除
- 定期删除
- 惰性删除
其中,定时删除和定期删除是主动删除策略,惰性删除是被动删除策略。
定时删除
- 定时删除是在设置 key 的过期时间的同时,会创建一个定时器(timer)。定时器在 key 的过期时间来临时,立即执行对 key 的删除操作。这种对 CPU 时间最不友好。在过期 key 比较多的情况下,删除过期 key 这一行为可能会占用相当一部分 CPU 时间,在内存不紧张但是 CPU 时间非常紧张的情况下,将 CPU 时间用在删除和当前任务无关的过期 key 上。
定期删除
- 定期删除是每隔一段时间,程序就会对 Redis 数据进行一次检查,删除里面的过期 key,至于要删除多少过期 key,以及要检查多少个 db,则是由 Redis 内部算法决定。可以有效地减少因为过期 key 而带来的内存浪费。
惰性删除
- 惰性删除是定时删除和定期删除的折中处理方案。它放任 key 过期不管,但是每次获取 key 时,都会检查取得的 key 是否过期,如果过期,则删除该 key;若没有过期,就返回该 key 的值
当时我就用redis manage 观察key情况,表现良好,也没有到过期时间就删除的情况。
直到端午节过后,我才发现我刚登录就退出了,报登录过期,这不对啊。
马上去看了一下可以,大吃一惊,所有key都被删除了,就剩下几个刚登录的。我想这跟配置应该没有太大关系。我就去看了下redis配置文件,一看连密码都没有设置一个,这这这~~~~
我赶紧让开发把密码加上,重新部署下服务。随后我也去看了下命令行,发现一个很奇怪的事情。有 flushall运行过,代码里也没有啊,这是怎么运行的呢,后来观察使用ip,也只发现了公司的ip在使用,没有陌生的ip。
观察了两三天,没有出现全部删除key的情况了,这应该是解决了。
这次的bug让我有很深的感触,安全这个东西太重要了。