Redis的单机模式并不难,配置文件参数了解具体含义,设置适合自己的业务即可。关于Redis的数据结构和对象的知识我之前记录过(可以点击Redis标签查看),下面开始填坑。复制在Redis中,用户可以通过执行SLAVEOF命令或设置slaveof选项让一个服务复制(replicate)另一个服务器。“复制”服务器是“主服务器(master)”,另一台“复制”服务器称为“从服务器(slave)”。例如🌰:(Redisversionis4.0.8)Startaredis-serveronport6379:$redis-server--port6379$redis-cli-p6379127.0.0.1:6379>startaredis-serveron6380端口,然后通过slaveof命令复制$redis-server--port6380$redis-cli-p6380127.0.0.1:6380>slaveof127.0.0.16379OK这里6379为主服务器,6380为从服务器。接着能在6380的redis-server界面中看到日志:19092:S23Mar01:00:26.944*Beforeturningintoaslave,usingmymasterparameterstosynthesizeacachedmaster:Imaybeabletosynchronizewiththenewmasterwithjustapartialtransfer.19092:S23Mar01:00:26.945*SLAVEOF127.0.0.1:6379enabled(userrequestfrom'id=2addr=127.0.0.1:60778fd=8name=age=50idle=0flags=Ndb=0sub=0psub=0multi=-1qbuf=0qbuf-free=32768obl=0oll=0omem=0events=rcmd=slaveof')19092:S23Mar01:00:27.234*ConnectingtoMASTER127.0.0.1:637919092:S23Mar01:00:27.234*MASTER<->SLAVEsyncstarted19092:S23Mar01:00:27.234*NonblockingconnectforSYNCfiredtheevent.19092:S23Mar01:00:27.246*MasterrepliedtoPING,replicationcancontinue...19092:S23Mar01:00:27.246*Tryingapartialresynchronization(request2e56cf1343f6b2e864c968bd59b4a16ed78b8f1d:1).19092:S23Mar01:00:27.266*Fullresyncfrommaster:bf36b20c3942e91ac4f262a2afdc90970b2d7c54:019092:S23Mar01:00:27.266*Discardingpreviouslycachedmasterstate.19092:S23Mar01:00:27.441*MASTER<->SLAVEsync:receivING187ByTesFrommerster19092:S23MAR01:00:27.442*Master<->Slavesync:flushingoldData19092:s23mar01:00:00:27.442*master<->master<->slavesync:loadingdbinmemory<-Slavesync:loadingdbinmemory<-S290909090909090909090909090909090909090909090909090.1909090909090909090.19090909090909090.44号:向主服务器发送“SYNC命令”主服务器通过BGSAVE(在子线程中运行)生成RDB文件,发送给从服务器。BGSAVE过程中主服务器的写操作被存储在缓冲区中,并发送给从服务器进行复制。从服务器两侧的数据库将保存相同的数据。从概念上讲,这种现象叫做**“数据库状态一致”,简称“一致”**老版本复制功能的缺陷老版本是指2.8之前的Redis,从服务器到master的复制服务器分为两种情况:“初始复制”:从服务器之前没有复制过任何主服务器,或者从服务器要复制的主服务器与上次复制的主服务器不同。“断开后重新复制”:命令传播阶段的主从服务器由于网络原因中断复制,但从服务器通过自动重连重新连接到主服务器,继续复制主服务器。对于初始复制,复制老版本是没有问题的,但是断线重连后,如果从服务器当时已经复制了一些,重连后从服务器需要重新复制,造成了一些浪费。“旧版本使用SYNC命令复制”,这是一个非常浪费资源的操作。新版复制的优点在复制的同时使用PSYNC命令代替SYNC命令进行同步。有**全重同步(fullresynchronization)和部分重同步(partialresynchronization)两种模式**:全重同步:和初始复制一样,先让master服务器发送RDB文件,然后将其发送给从服务器存储的命令在同步缓冲区中。部分重分离步骤:当从服务器断开后,下次可以发起PSYNC命令,从中断点开始,进行部分重同步,只需要将从服务器丢失的写命令发送给从服务器用于执行的从服务器。此时使用的资源明显少于执行SYNC命令所需的资源。新版复制的部分重同步功能由以下三部分组成:主服务器的**复制偏移量(replicationoffset)**和从服务器的复制偏移量。主服务器和从服务器都持有复制偏移量的副本。如果偏移量一致,则表示它们处于一致状态;否则,两者处于不一致状态。主服务器的“复制积压缓冲区(replicationbacklog)”复制积压缓冲区是由主服务器维护的一个“固定大小(fixed-size)的先进先出(FIFO)队列”,默认为1MB.主服务器的复制积压缓冲区会保存一些最近传播的写命令,复制积压缓冲区会记录队列中每个字节对应的复制偏移量。当从服务器重新连接到主服务器时,从服务器会通过PSYNC命令将自己的偏移量发送给主服务器,主服务器会根据复制偏移量来决定对从服务器进行什么样的同步操作。服务器的“运行ID(runID)”每个服务器都有自己的运行ID,它是在服务器启动时自动生成的,由40个堆叠的十六进制字符组成。当从服务器第一次复制主服务器时,主服务器会将自己的运行ID传递给从服务器,从服务器将发送的这个运行ID保存下来。断线重连后,如果从服务器保存的运行ID与当前连接的主服务器的运行ID相同,则主服务器会尝试进行“部分重同步操作”。反之,如果不一致,主服务器会在从服务器上执行“全重同步操作”。PSYNC命令具体调用参考流程图实现:在心跳检测的命令传播阶段,从服务器默认以每秒一次的频率向主服务器发送命令:$REPLCONFACK
