面试题答案
一键面试主库过期键处理
- 正常过期删除:主库会像处理普通键一样,按照过期策略(如定期删除、惰性删除)对过期键进行处理。当一个键过期时,主库会删除该键,并向从库发送
DEL
命令。这样从库就能与主库保持数据一致性,知道该键已过期并删除。 - 过期键传播:主库在执行写命令修改数据时,如果涉及到过期键,会同时将这个修改操作(包括对过期键的操作)以
REPL
协议的形式发送给从库。从库收到这些命令后,会在自己的数据副本上执行相同的操作,从而保持与主库的数据状态一致。
从库过期键处理
- 不主动过期删除:从库不会主动按照过期策略去删除过期键,而是等待主库发送
DEL
命令或者其他覆盖该键的写命令。这样设计是为了保证主从库之间的数据一致性,避免从库自行删除过期键后与主库状态不一致的情况。 - 过期键查询处理:当客户端在从库上查询一个过期键时,从库不会直接返回键已过期的信息。因为从库要保持与主库的数据一致性,它会将这个查询请求转发给主库(如果配置了
slave-read-only yes
),由主库来判断键是否过期并返回结果。如果主库判断该键已过期,会返回键不存在的信息;如果键未过期,则返回键的值。这种方式保证了客户端在从库上查询到的数据与主库一致。
网络异常时的容错
- 部分重同步:如果主从库之间的网络出现短暂中断,当网络恢复后,从库会尝试与主库进行部分重同步。主库会记录最近执行的写命令,生成一个
repl_backlog
。从库会向主库发送自己的偏移量,主库根据偏移量判断哪些写命令需要补发。这样,即使在网络中断期间有过期键的相关操作,从库也能通过部分重同步获取到这些操作,从而保持数据一致性。 - 全量重同步:如果网络中断时间较长,导致部分重同步无法进行(如从库的偏移量与主库记录的
repl_backlog
不匹配),主从库会进行全量重同步。主库会将自己的整个数据集发送给从库,从库清空当前数据并重新加载主库发送的数据。在这个过程中,过期键也会随着全量数据一起被正确同步,确保从库的数据与主库一致。