1. 程式人生 > >Redis高階應用——2

Redis高階應用——2

Redis-事務

Redis 事務可以一次執行多個命令, 並且帶有以下兩個重要的保證:

  1. 事務是一個單獨的隔離操作,事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷。
  2. 事務是一個原子操作:事務中的命令要麼全部被執行,要麼全部都不執行

事務的上個步驟:

  1. 開啟事務:以MULTI開啟一個事務
  2. 命令入隊:將多個命令新增到命令佇列中,接到這些命令不會立即執行,而是放到等待執行的事務佇列中
  3. 執行事務:有EXEC執行事務。(或者DISCARD取消執行)

事務相關指令:

指令 描述
MULTI 標記一個事務塊的開始
EXEC 執行所有事務塊內的命令。
DISCARD 取消事務,放棄執行事務塊內的所有命令。
UNWATCH 取消 WATCH 命令對所有 key 的監視。
WATCH key [key ...] 視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷

 

執行事務出現的四種情況:

  1. 正常執行:佇列中所有的指令全部會被執行。
  2. 全部取消:佇列中的所有指令全部會被取消。
  3. 全體連坐:如果指令集中有一條在加入佇列時報錯,則佇列中的所有指令全部取消。
  4. 冤頭債主:如果指令已經加入到佇列中,但執行失敗,只有當前指令失敗,其它繼續執行。

 

redis事務的三個特性:

  1. 單獨的隔離性:事務中的所有的命令都會序列化,按順序執行,事務在執行過程中,不會被其它客戶端傳送過來的命令請求所打斷
  2. 沒有隔離級別的概念:佇列中的命令沒有提交之前都不會實際的被執行,因為事務提交前任何指令都不會被實際執行,也就不存在”事務內的查詢要看到事務裡的更新。
  3. 不保證原子性:redis同一個事務中如果有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾

watch監控

watch監控表示對需要操作的key新增一個樂觀鎖,防止另一個使用者進行修改,導致結果錯誤。

  • 悲觀鎖
    • 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會被block直到它拿到鎖。傳統的關係型資料庫裡面就用到了很多這種鎖,比如行鎖,表鎖,讀鎖,寫鎖等,都是在操作之前先上鎖。
  • 樂觀鎖
    • 顧名思義,就是很樂觀,每次去拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,可以使用版本號等機制。提交的版本號必須大於當前版本號才可以提交

在訪問以寫入為目的資料的時候(SOL中的SELECT FOR UPDATE),關係資料庫會對被訪同的資料行進行加鎖,直到事務被提交(Commit)
或者被回滾(ROLLBACK)為止,如果有其他客戶端試圖對被加鎖的資料行進行寫入,那麼該客戶端將被阻塞、直到第一個事務執行完畢為止。加鎖在實際使用中非常有效,基本上所有關係資料庫都實現了這種加鎖功能,它的缺點在於,持有鎖的客戶端執行越慢,等待解鎖的客戶端被阻塞的時間就越長。

因為加鎖有可能會造成長時間的等待,所以Redis為了儘可能地減少客戶端的等待時間,並不會在執行WATCH命令時對資料進行加鎖,相反地,Redis只會在資料已經被其他客戶端搶先修改了的情況下,通知執行了WATCH命令的客戶端,

Redis-主從複製

什麼是主從複製?

主從複製,是用來建立一個和主資料庫(master)完全一樣的資料庫環境,稱為從資料庫(slave)。

主從複製的作用和使用場合一般有幾個:

  1. 容災恢復,主資料庫伺服器故障後,可迅速從從資料庫恢復
  2. 讀寫分離、主資料庫主要做寫的操作,從資料庫做讀的操作

主從複製應用場景

  • 電子商務網站上的商品,一般都是一次上傳,無數次瀏覽的,說專業點也就是”多讀少寫”。
  • 對於這種場景,我們可以使如下這種架構

主從複製應用場景說明

 

我們將一臺Redis伺服器作主庫(Matser),其他三臺作為從庫(Slave),主庫只負責寫資料,每次有資料更新都將更新的資料同步到它所有的從庫,而從庫只負責讀資料。這樣一來,就有了兩個好處:

    1. 資料被複製成了了好幾份,就算有一臺機器出現故障,也可以使用其他機器的資料快速恢復。
    2. 讀寫分離,不僅可以提高伺服器的負載能力,並且可以根據讀請求的規模自由增加或者減少從庫的數量,棒極了;

注意事項:

在Redis主從模式中,一臺主庫可以擁有多個從庫,但是一個從庫只能隸屬於一個主庫

主從複製實現方式

  1. 一主二僕
  2. 薪火相傳
  3. 反客為主

一主二僕

一個Master兩個或多個Slave

具體操作:

在多臺機器上配置好redis環境,並修改相應的配置檔案

只需要在從資料庫加配置如下程式碼:

slaveof 主資料庫地址  主資料庫埠

例如:slaveof 127.0.0.1 6379

如果設定了密碼:

masterauth 主庫密碼

示例在一臺機器上面實現一主二僕:

這裡是用的windows版本的redis,然後可以根據Windows Service Documentation.docx文件建立後臺服務

開啟之後找到 redis-server --service-install  和 redis-server --service-uninstall

建立從伺服器

啟動客戶端

​實現主僕關係

當主庫意外關閉時,從庫是什麼情況?

當主庫關閉時,從庫繼續保持從庫狀態,但是和主庫的連線丟失,不能在同步更新資料。如果主庫恢復,從庫也會恢復到連線狀態。 當從庫1關閉時,主庫和從庫N都不受影響。但是當從庫重新恢復時,丟失和主庫的連線狀態,必須重新關聯。

薪火相傳

什麼是薪火相傳?

上一個Slave可以是下一個slave的Master,Slave同樣可以接收其他slaves的連線和同步請求,那麼該slave作為了鏈條中下一個的master,可以有效減輕master的寫壓力

中途變更轉向:會清除之前的資料,重新建立拷貝最新的

實現方式:

slaveof 新主庫IP 新主庫埠​

薪火相傳-演示

1.開啟三臺伺服器(-主二僕)

2.從客戶端連線三臺伺服器,通過指令info replication查詢狀態 

3.將6381的主機修改成6380

語法:slaveof 主機IP  埠

4.再檢視效果

反客為主

什麼是反客為主?

使當前資料庫停止與其他資料庫的同步,轉成主資料庫

指令:SLAVEOF no one

演示:

  1. 開啟三個伺服器
  2. 開啟相應的三個客戶端
  3. 將主伺服器客戶端shutdown
  4. 將第二個客戶端(6380)SLAVEOF no one,反客為主
  5. 將其他的客戶端指向新的master(SLAVEOF 127.0.0.1 6380)

主從複製執行過程:

  1. 當一個從資料庫啟動時,會向主資料庫傳送sync命令。
  2. Master接到命令啟動後臺的存檔程序,同時收集所有接收到的用於修改資料集命令,在後臺程序執行完畢之後,master將傳送整個資料檔案到slave,以完成一次完全同步。
  3. 全量複製:而slave服務在接收到資料庫檔案資料後,將其存檔並載入到記憶體中。
  4. 增量複製:Master繼續將新的所有收集到的修改命令依次傳給slave,完成同步。
  5. 但是隻要是重新連線master,一次完全同步(全量複製)將被自動執行。