Redis 是一個 in-memory 的資料庫,所以資料都會被儲存在記憶體中,這樣的好處是可以提升資料的存取速度。

以往想要將資料放在記憶體來提升存取速度大多是使用 Session 來達成,但是 Session 會因為電腦或伺服器被關閉而被清除。更麻煩的問題是當一個應用要部署到多台伺服器上來分散流量的話 Session 就會不同步,這樣會導致資料和結果不正確。

所以另外一種作法就是搭配 Cookie 存放 Session Id 然後把 Session 資料存到資料庫來解決資料不同步的問題,但是這樣就要每次都去資料庫讀資料反而會增加存取的時間。

因此 Redis 提供了一些非常實用的功能來實現多機的 in-memory 資料庫,如下:

主從複製模式

主從複製模式提供讓 Master(主伺服器) 向任意數量的 Slave(附屬伺服器) 進行資料同步,以解決單點資料庫的問題。

主從複製模式最主要的目的是要實現讀寫分離和資料備份。Redis 讀寫分離的作法是 Master 可以進行讀取和寫入,其他的 Slave 只能讀取。透過 Slave 幫忙處理讀取的工作來減輕 Master 的負擔。

工作流程

  1. Slave 啟動之後會主動向 Master 發送 Sync 命令要求進行同步。
  2. Master 收到之後會執行 Bgsave 命令建立 rdb 快照檔案儲存到硬碟。同時,Master 會把新收到的寫入和修改資料庫的命令存到緩衝區。
  3. Master 會將剛建立好的快照檔案傳給 Slave。
  4. Slave 收到快照檔案後會先把記憶體清空,接著載入收到的快照檔案。
  5. Master 會再把存在緩衝區的命令傳給 Slave,Slave 再執行這些命令以達成和 Master 同步。
  6. 以上便完成了 Slave 的資料初始化,此後只要 Master 每執行一道寫入或修改資料庫的命令都會傳送給 Slave 以達到資料的同步。
  7. Master 和 Slave 會互相發送 heartbeat 的訊息,也就是傳送 Ping 指令。以告知對方我還正常運作也檢查對方是否還正常運作。

哨兵模式