Redis (三 redis的事务和主从同步)

来源:互联网 发布:高分复读 知乎 编辑:程序博客网 时间:2024/05/19 09:48

multi   进入事务模式

discard   取消事务

exec   执行事务

注意:redis只能保证事务内的命令可以按顺序执行,并不能在有命令执行失败时,可以回滚

multi命令为客户端添加事务处理的标识,redis便将接下来的命令放到命令队列


##持久化,

redis是内存数据库,断电消失,为了弥补,提供了持久化操作:内存快照和日志追加Append-only file

内存快照是把内存中的数据以快照的形式写入二进制文件,默认文件名dump.rdb

客户端通过save或bgsave告诉服务端保存快照

save在主线程保存快照,由于redis是单线程,所以会阻塞其它客户端请求,所以最好不要用save

save 是每次保存完整数据,而不是增量数据

save <seconds> <changes> eg: save 900  300表示过900s或者修改300次就保存一次


aof日志追加是把增加,修改数据的命令通过write函数保存到文件尾,默认appendonly.aof

重启时读取文件写入内存,日志追加方式可以有效的降低数据丢失的风险,但持久化文件大小会不断膨胀

,例如调用100次incr nums命令,就会保存100条incr nums,其实,99条是多余的,直接set nums 100就可以了

为了压缩日志文件,redis提供了,bgwriteaof命令,redis收到这个命令就会适应类似于内存快照的方式将内存的数据以命令的方式保存到临时文件,最后替换原来的文件


##主从同步

master可以有多个slave

slave不会阻塞master

master上禁止使用数据持久化,只在从库上进行

设置完主从同步,slave主动连接master,发送sync命令,master启动一个后台进程,将内存数据以快照形式写入文件中,同时开始收集新的写命令并缓存起来,master后台完成内存快照后,发数据文件发给slave,后续master收到的写命令都通过开始建立的连接发送给salve,master收到多个slave的连接请求时,只启动一个进程写数据库镜像,然后发送给所有的slave

即:

(1)slave主动连接master

(2)slave发送sync命令到master

(3)master备份数据到rdb文件

(4)master把rdb文件传送到slave

(5)slave清空数据库数据,把rdb文件数据导入

接下来master把用户的更改或者添加操作,用命令的形式直接发送给slave

redis主从配置:slaveof  192.168.1.1 6379

### slave端的工作流程:

syncWithMaster调用anetTcpConnect连接到master服务器,发送sync命令到master服务器,发送sync命令到master服务器请求同步操作,调用aeCreateFileEvent监听master是否可读,如果是可读状态,调用readSyncBulkPayload函数从master服务器处读取数据,最后设置slave服务器的同步状态为REDIS_REPL_TRANSFER,表示正在从master读取数据

readSyncBulkPayload从master服务器处读取内存快照文件(rdb文件)数据,并保存到本地文件导入数据库

### master端的工作流程:

注意点:如果该服务器同时是master和slave,必须等待slave端工作完毕才能进入master

sync主要是发起一个内存快照的备份,如果此时正在执行备份,就要判断改操作是否由其它slave发起,是的话,不必发起备份,否则就要等此次备份完成后发起新的内存快照备份,如果此时没有正在备份,则发起内存快照的备份,备份完成后,master服务器调用backgroundSaveDoneHandler函数进行后续工作,并且调用updateSlaveWaittingBgsave进行下一步同步工作,update函数会便利slave列表,为每一个slave创建一个写事件,事件回调函数为sendBulkToSlave,如果有slave需要发起一个新的内存快照备份,把startbgsave设置为1调用rdbSaveBackGround发起新的备份工作

sendBulkToSlave负责把内存快照文件发送给slave

文件发送到slave后,第一步完成,同步流程的第二步:

master把客户端发送过来的命令转发给slave,实现同步


0 0
原创粉丝点击