天天看點

Redis主從同步 和 持久化 Pipeline 原理

redis主從複制:

1. 同一個master可以有多個slaves

2. slave可以接受其它slaves的連接配接和同步請求, 這樣會有效地分載master的同步壓力.

3. master以非阻塞方式為其slave提供同步服務. 是以在master - slave 同步期間, 用戶端仍然可以送出查詢,修改的請求.

4. slave server也是以非阻塞方式完成資料同步的. 在同步期間, 若有用戶端送出查詢請求, 則傳回同步之前的資料.

5. 為了分載master的讀壓力, slave可以為用戶端提供隻讀的服務, 寫服務是由master來完成的.

6. master可将資料儲存操作交給slaves完成, 進而避免了在master中要有獨立的程序來完成此操作.

在slave啟動并連接配接到master之後, slave會主動發送一個SYNC指令. 然後master會啟動背景存盤程序, 同時手機所有接受到的用于修改資料集的指令, 在背景程序執行完畢後, master将傳送整個資料庫檔案到slave, 來完成一次完全同步. slave在接受到資料庫檔案後将其存盤加載到記憶體. 此後, master繼續将已經收集到的修改指令, 和新的修改指令依次傳送給slaves, slave将再依次執行這些資料修改指令, 進而達到最終的資料同步.

如果master和slave之間連接配接斷開, slave會自動重連, 但在重連成功後, 一次完全同步将會自動被執行.

完全同步會傳送整個資料庫檔案到slave, 故會有一定的資源消耗.

Redis的持久化.

1. RDB持久化: 在指定時間間隔内将記憶體中的資料集快照寫入磁盤

2. AOF持久化: 以事物日志的形式記錄伺服器所處理的每一個寫操作, 在redis伺服器啟動之初會讀取該日志檔案來重構資料庫, 以保證啟動後資料庫中的資料是完整的. (通過redis-check-aof工具檢查)

3. 無持久化: 通過配置禁止啟動redis的持久化功能, 來作為一個加強版的memcached.

4. 同時啟動AOF和RDB.

注意:

a. AOF檔案常常大于RDB檔案.

b. AOF在運作效率上往往慢于RDB.

c. AOF的資料一緻性要好于RDB.

Redis虛拟記憶體的使用

1. 若資料庫中有大量的keys, 但每個key僅僅關聯很小的value, 那麼這種情形不适合使用虛拟記憶體.

2. 若資料庫中包含少量的keys, 每個key關聯的value都非常大, 這種情形非常适合使用虛拟記憶體.

預設情況下Redis會将keys/values儲存在記憶體中以提高資料的查詢和修改效率.

使用虛拟記憶體時, 會将不常用的keys 對應的 values換出到磁盤. 當被再次通路時再讀進記憶體.

**注意:**Redis不會将keys交換到磁盤.

換出原則: 将最長時間沒有被使用的資料換出, 若兩個對象的age相同, 那麼value較大的那個将先被換出.

vm-enabled yes

vm-max-memory (bytes)

vm-pages 134217728

vm-page-size 32

vm-max-threads 4

Redis支援管線操作(pipeline), 這樣會減少RTT(round trip time)時間開銷.

用戶端在發送指令後不用等待伺服器的應答, 而是可以繼續後面的指令. 最後把所有的應答傳回給用戶端.

伺服器會将應答先存入隊列, 之後再發送給用戶端.

繼續閱讀