版權聲明:本文為博主原創文章,未經博主允許不得轉載。
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,實現同步
新聞熱點
疑難解答