首先介绍一个小的知识点,Redis的debug sleep命令可以阻塞实例,使用方式:

127.0.0.1:6379> DEBUG sleep 80
OK
(80.10s)

在配置redis复制机制我们了解,在处理完写入命令后,主实例会将这些命令发送给它的从实例以便实现主从实例之间的数据同步。从主实例的角度来看,要判断从实例是否仍在正常运行,就需要每隔一段时间向从实例发送一个PING命令,我们可以通过配置文件或redis-cli修改repl-ping-slave-period参数来调整这个间隔。PING命令默认时间为10s。从从实例的角度来看,从实例会每秒向主实例发送REPLOCNF ACK {offset}来报告它的复制偏移量。对于PING和REPLCONF ACK来说,都可以通过repl-timeout指定超时时间。复制默认的超时时间为60s。如果两次PING和REPLCONF ACK之间的间隔时间比超时时间长,或者repl-timeout期间主从实例没有数据流量,那么主从之间的复制连接将会断开。

在实际生产环境中,repl-ping-slave-period的值必须小于repl-timeout。否则,只要每次主实例和从实例咩有流量时就会造成复制超时。通常,因为redis服务器命令处理引擎是单线程的,所有阻塞操作可能造成复制超时。为了避免复制超时的发生,我们应该尽量避免使用会导致长时间阻塞的命令。在大多数情况下,repl-timeout的默认值是足够的。

Redis的键过期机制主要是由主实例驱动的,也就是,当主实例中的键到期时,它会向所有的从实例发送一个del命令,在同步期间,del命令也会被放到复制客户端缓冲区中。