使用redis管理資料,理解如何使用事務儲存鍵值對資料很重要。redis事務與rdmms事務有些類似,但也有差異。redis主要通過幾個命令有效管理事務,本文討論redis的watch命令以及如何使用。
在閱讀之前你最好安裝好redis環境,熟悉redis常用命令。
redis事務命令主要包括 watch, exec, discard, multi。這些命令構成一組命令塊,確保在乙個步驟中全部執行。首先,它們確保事務中的命令將按順序執行並序列化。這意味著在執行redis事務時,來自不同客戶端的請求不會被伺服器接受處理。此外,redis事務保證是原子的,即要麼執行所有的命令,要麼不執行。
了解了redis事務機制後,我們繼續看如何使用命令實現事務。
redis事務使用multi
命令啟動,其總是返回ok
。這時使用者可以執行多條命令,redis在佇列中加入這些命令,當使用者執行exec
命令時才真正執行佇列中的命令。如果使用者執行discard
命令,redis丟棄佇列中的命令結束事務。
前節我們從頂層介紹了redis的事務及操作過程。本節主要討論rediswatch
命令以及其在事務中扮演的角色。
watch
命令是exec
命令的執行條件;也就是說,如果watch的key沒有被修改則redis執行事務,否則(watch的key被其他事務修改了)事務不會被執行。
watch
命令可以被呼叫多次,乙個watch
命令可以監控多個key。watch
命令呼叫即啟動監控功能,從watch
命令開始點到執行exec
命令終止。一旦exec
被呼叫,所有的鍵都將不被監視,無論所討論的事務是否被中止。關閉客戶端連線也會觸發所有的鍵被取消監視。
rediswatch
命令給事務提供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會執行失敗。只有當沒有競爭條件時才能正確執行事務。這種鎖處理也稱為「樂觀鎖」,它提供有效昂是保障競爭條件。大多數情況下不同客戶端訪問不同的鍵,因此衝突的概率相當小,事務不太可能需要重複執行。
事務是redis的基本元件,學習如何有效使用很重要。 exec, watch, multi, discard 命令作為實現事務機制的基本命令,管理事務執行保證資料完整性。本文主要介紹watch命令及如何使用該命令,希望對對理解redis事務有幫助。
php使用redis watch秒殺搶購
redis的watch multi exec 方法實現秒殺搶購。優點 使用了樂觀鎖沒有鎖的等待,比佇列方式減少了大量的記憶體消耗。watch 監視乙個或多個key,如果在事務執行之前這個 或這些 key被其他命令所改動,那麼事務將被打斷.redis new redis result redis co...
使用redis watch實現秒殺搶購,避免超賣
涉及搶購 秒殺 搶票等活動時,為了避免超賣,那麼庫存數量是有限的,但是如果同時下單人數超過了庫存數量,就會導致商品超賣問題。那麼我們怎麼來解決這個問題呢?header content type text html charset utf 8 redis new redis result redis ...
python使用argparse模組寫命令列內容
寫命令python和c是有很大區別的。c可以通過mian函式,而python可以通過呼叫內建模組。import argparse parse argparse.argumentparser parse.add argument bug feature help file that only cont...