redis事務中的WATCH命令和基於CAS的樂觀鎖

在Redis的事務中,WATCH命令可用於提供CAS(check-and-set)功能。假設咱們經過WATCH命令在事務執行以前監控了多個Keys,假若在WATCH以後有任何Key的值發生了變化,EXEC命令執行的事務都將被放棄,同時返回Null multi-bulk應答以通知調用者事務執行失敗。例如,咱們再次假設Redis中並未提供incr命令來完成鍵值的原子性遞增,若是要實現該功能,咱們只能自行編寫相應的代碼。其僞碼以下:
val = GET mykey
val = val + 1
SET mykey $val
以上代碼只有在單鏈接的狀況下才能夠保證執行結果是正確的,由於若是在同一時刻有多個客戶端在同時執行該段代碼,那麼就會出現多線程程序中常常出現的一種 錯誤場景--競態爭用(race condition)。好比,客戶端A和B都在同一時刻讀取了mykey的原有值,假設該值爲10,此後兩個客戶端又均將該值加一後set回Redis服 務器,這樣就會致使mykey的結果爲11,而不是咱們認爲的12。爲了解決相似的問題,咱們須要藉助WATCH命令的幫助,見以下代碼:
WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC
和此前代碼不一樣的是,新代碼在獲取mykey的值以前先經過WATCH命令監控了該鍵,此後又將set命令包圍在事務中,這樣就能夠有效的保證每一個鏈接在 執行EXEC以前,若是當前鏈接獲取的mykey的值被其它鏈接的客戶端修改,那麼當前鏈接的EXEC命令將執行失敗。這樣調用者在判斷返回值後就能夠獲 悉val是否被從新設置成功。        多線程

相關文章
相關標籤/搜索