追查 Redis 过期 Key 未失效的原因(redis过期未失效问题)
假设某工程师手动/自动给 Redis 数据库的 key 设置了过期时间,但当组的最大过期时间到达之后,key 还没有失效,此时工程师可能要排查这个 key 为什么没有失效的原因。
需要找到设置过期时间的代码,看这个 key 是如何设置过期时间的,可以使用这条命令来查询这个 key 的过期时间:
ttl key_name
如果返回 -1,则说明这个 key 没有设置过期时间,排查需要关注这两个方面:
* 代码初始化问题:检查代码是否正确设置了过期时间,并且即使是多个客户端都能正确设置过期时间;
* 过期检测错误:如果从多个客户端设置了过期时间,那么可能是 Redis 无法正确的检测到这个 key 的过期时间,这种情况下需要重新开启 Redis 服务,并且执行 redis-check-aof 和 redis-check-rdb 这两个命令来检查内部是否存在损坏的数据,以保护数据的完整性。
此外,如果在 Redis 内部存在过一些内存溢出的问题,那么 Redis 会被强制退出并且清空缓存,导致 key 失效。此时可以查看 Redis 的 log 日志来查找原因,如果发现了内存泄漏的问题,就可以针对特定的代码做优化来减少内存的消耗,从而避免该问题的再次发生。
为了确保 key 一定能够在期望的时间失效,可以使用一个定时任务,比如每隔一定时间执行一次 redis-check-aof 和 redis-check-rdb 这两个命令,确保 Redis 能够准确的检测 key 的失效时间,从而保证 key 的正确性。