在Redis 3.2之前的版本,从库在处理客户端读请求时并不会判断数据是否过期,而是直接返回数据。但在3.2版本后,Redis做了改进,如果读取的数据已经过期了,从库虽然不会删除,但是会返回空值(null),这就避免了客户端读到过期数据。所以,在主从架构中,尽量使用Redis 3.2及以上版本。但redis 3.2之后的版本也并不能完全保证不读到过期数据,这跟Redis用于设置过期时间的命令有关系,有些命令给数据设置的过期时间在从库上可能会被延后,导致应该过期的数据又在从库上被读取到了。
例如当主从库全量同步时,如果主库接收到了一条EXPIRE命令,那么主库会直接执行这条命令,并在全量同步完成后发给从库执行,而从库在执行时,就会在当前时间的基础上加上数据的存活时间,这样从库上数据的过期时间就会比主库上延后了。为了避免这种情况,在业务应用中尽量使用expireat和pexpireat命令,把数据的过期时间设置为具体的时间点,避免读到过期数据。