如何使用Redis Watch命令

如何使用Redis Watch命令

使用Redis管理數據,理解如何使用事務存儲鍵值對數據很重要。Redis事務與RDMMS事務有些類似,但也有差異。Redis主要通過幾個命令有效管理事務,本文討論Redis的Watch命令以及如何使用。

1. 概述

在閱讀之前你最好安裝好Redis環境,熟悉Redis常用命令。
Redis事務命令主要包括 WATCH, EXEC, DISCARD, MULTI。這些命令構成一組命令塊,確保在一個步驟中全部執行。首先,它們確保事務中的命令將按順序執行並序列化。這意味着在執行Redis事務時,來自不同客戶端的請求不會被服務器接受處理。此外,Redis事務保證是原子的,即要麼執行所有的命令,要麼不執行。

瞭解了Redis事務機制後,我們繼續看如何使用命令實現事務。
Redis事務使用MULTI命令啓動,其總是返回OK。這時用戶可以執行多條命令,Redis在隊列中加入這些命令,當用戶執行EXEC命令時才真正執行隊列中的命令。如果用戶執行DISCARD命令,Redis丟棄隊列中的命令結束事務。

2. Watch命令

前節我們從頂層介紹了Redis的事務及操作過程。本節主要討論Redis Watch 命令以及其在事務中扮演的角色。
Watch 命令是Exec命令的執行條件;也就是說,如果Watch的Key沒有被修改則Redis執行事務,否則(Watch的key被其他事務修改了)事務不會被執行。
Watch 命令可以被調用多次,一個Watch 命令可以監控多個key。Watch 命令調用即啓動監控功能,從Watch 命令開始點到執行EXEC命令終止。一旦EXEC被調用,所有的鍵都將不被監視,無論所討論的事務是否被中止。關閉客戶端連接也會觸發所有的鍵被取消監視。

Redis Watch 命令給事務提供check-and-set (CAS) 機制。被Watch的Key被持續監控,如果key在Exec命令執行前有改變,那麼整個事務被取消,Exec返回null表示事務沒有成功。

請看下面示例,我們需要給key的值加一,使用下面命令:

num = GET sampleKey
num = num + 1
SET sampleKey $num

上面命令在單用戶執行環境下沒有任何問題。如果多個用戶嘗試同時正鍵的值會產生問題,假設sampleKey 原來值爲13,兩個客戶端嘗試同時增加值。兩者都將鍵設爲14,最終結果爲14而不是15。

使用watch命令可以解決該問題:

WATCH sampleKey
num = GET sampleKey
num = num + 1
MULTI
SET sampleKey $num
EXEC

使用上面代碼,如果競爭條件發生,因爲鍵被監控,Exec會執行失敗。只有當沒有競爭條件時才能正確執行事務。這種鎖處理也稱爲“樂觀鎖”,它提供有效昂是保障競爭條件。大多數情況下不同客戶端訪問不同的鍵,因此衝突的概率相當小,事務不太可能需要重複執行。

3. 總結

事務是Redis的基本組件,學習如何有效使用很重要。 EXEC, WATCH, MULTI, DISCARD 命令作爲實現事務機制的基本命令,管理事務執行保證數據完整性。本文主要介紹Watch命令及如何使用該命令,希望對對理解Redis事務有幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章