在单机模式下,我们使用多线程生成RDB是9.15分的,主线程修改了我们还没有读取的数据时,或者主线程修改了你刚刚已经序列化到文件中的某个数据。所以我们记录的RBD可能会有9.15分01秒的数据,所以,我们牺牲了一部分RBD的准确性,来换取生成RDB的速度。
所以我们很难保证我们生成的RDB就是那一个确定的时间点的。我们生成RDB的数据是为了有一个冷备份,为了防止服务器数据的丢失,所以RDB可以越新越好,所以我们可以在单机模式下使用多线程生成RDB可以又快又新。
但是在主从模式下,redis主节点salve从节点时候,Redis主节点会生成当时时刻的内存快照RDB文件,同时把RDB期间的所有的命令写到缓存中,等从节点从主节点的RDB文件恢复数据之后,便从主节点的命令缓存中读取所有的命令再进行执行一遍,以达到和主节点相同的状态。那么用多线程生成RDB时,如果当主线程执行某个写入命令时,从线程还未DUMP该数据,那么从线程生成的RDB就包含了该命令的执行结果。而子节点又恢复了数据之后,相当于子节点已经执行过了这个命令。那么当子节点从主节点的命令缓存中拉取命令来再执行一遍后,有些命令就会被重复执行。(会导致数据的不一致,比如incr)从salve从机就会跟master主机数据不一致。
结论,所以在单机模式下,可以开启多线程,但是在其他模式,最好不开启。