之前维护一个旧的系统,用的redis是哨兵模式,加上主从复制。发现有一些redis的key永远不过期,通过打印ttl发现是-2,证明该redis key已经到期了,但是还是可以获取的到key里面的值。

  第一,redis的过期的key,删除的机制有两种,一种是淘汰策略,大概有10种测率。第二种就是 redis在访问key的时候,主动删除过期的key。

       第二,redis的主从复制的原理,从库不会主动删除key,而是主库删除key后,把删除的命令同步到从库。

      第三,redis expire 同步有延迟,从库执行expire的时候,与主库相隔一段时间,导致从库过期时间比较主库的过期时间晚。

      3.0版本的redis 从库没有获取到同步命令的时候(大量数据过期,同步延迟),访问从库过期的key,还是能拿到数据的,3.2版本修复了这个bug,在从库获取的时候也判断一下是否过期,但是4.0版本的redis版本 exists 判断还是会有问题,

4.0.12版本修复了这个问题