redis键未到期自动删除bug
结论
由于由于宿主机和docker容器的时间不一致引起的,docker容器的时间是正常的。问题出在了我自己的windows电脑上。
解决办法
问题
我在用分布式锁的时候,发现了看门狗不生效。
过期时间设置的是30s,看门狗的续期时间是10s每次
也就是说正常情况下,键的ttl还剩20s的时候,下一秒应该变成30s
但是我通过redis的可视化面板一直刷新,发现有些时候这个键在22秒左右的时间的时候自动没了。是的,没错,就是自动没了。这还是个概现问题
这种情况下看门狗肯定是续约不上的,我开始怀疑是看门狗的问题。。。
然后开始怀疑淘汰策略,发现redis并没有用淘汰策略
redis-cli CONFIG GET maxmemory-policy
然后用redis-cli monitor持续监控,看有没有其他的线程操控了redis,发现并没有
天塌了!!!!
最后AI分析出了时间不一致的可能性
用date指令查看时间
发现时间确实不一致,相差了20多秒,一开始我还以为是docker容器的时间不正确。又操作了一波redis容器
最后手机拿出来一对,发现是windows的时间快了20多秒,那么一切都对上了
总结
本次问题的根本原因是宿主机(Windows)与 Docker 容器之间的时间不同步,而非 Redis 本身或看门狗机制的故障。
具体而言,Windows 宿主机时间比标准时间快了约 20 秒,而 Docker 容器通过虚拟化层获取的是正确的时间。这导致了一个微妙的现象:从宿主机视角观察,Redis 键的 TTL 在还剩 20 秒左右时”突然消失”,实际上是因为宿主机时间超前,误判了键的实际过期时间。
启示:
- 排查类似问题时,首先确认系统时间一致性,尤其是使用 Docker 等虚拟化环境时
- 分布式锁、看门狗等依赖时间敏感的机制,对时间同步尤为敏感
- 建议定期校准宿主机时间,或在关键业务场景部署 NTP 时间同步服务
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 青墨染烟雨!
评论
WalineTwikoo







