redis 莫名删除所有key

186 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

记录生产环境一次 redis bug。

事情要从两周前开始说起,五月底左右,接到运营同学反映,反馈系统中这两天出现了很多登录过期情况,当时bug反映到我这来了,我马上看了一下代码,拦截器、登录没有错啊,我就回复运营同学,是不是真的是token到期了,自动退出了。过了一天,运营又找上我,说用户在刚登录,没几分钟就提示登录过期了。当时想,是不是redis的事情。

我主要是前端开发,兼写部分后端代码,我就找了我们后端java开发,告诉他让马上看一下。

我自己也搜索了一下。

redis的删除key策略,主要分为下面三种:

  • 定时删除
  • 定期删除
  • 惰性删除

其中,定时删除和定期删除是主动删除策略,惰性删除是被动删除策略。

image.png

定时删除

  • 定时删除是在设置 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让我有很深的感触,安全这个东西太重要了。