redis樂觀鎖(適用於秒殺系統)

2021-09-07 15:29:39 字數 829 閱讀 7621

redis事務中的watch命令和基於cas的樂觀鎖

在redis的事務中,watch命令可用於提供cas(check-and-set)功能。假設我們通過watch命令在事務執行之前監控了多個keys,倘若在watch之後有任何key的值發生了變化,exec命令執行的事務都將被放棄,同時返回nullmulti-bulk應答以通知呼叫者事務執行失敗。例如,我們再次假設redis中並未提供incr命令來完成鍵值的原子性遞增,如果要實現該功能,我們只能自行編寫相應的**。其偽碼如下:

val = get mykey

val = val + 1

set mykey $val

以上**只有在單連線的情況下才可以保證執行結果是正確的,因為如果在同一時刻有多個客戶端在同時執行該段**,那麼就會出現多執行緒程式中經常出現的一種錯誤場景--競態爭用(racecondition)。比如,客戶端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是否被重新設定成功。

redis物件儲存(適用於訂單系統自動更新)

啟動 redis server.exe redis.windows.conf 連線 redis cli.exe h 127.0.0.1 p 6379 redis 127.0.0.1 6379 zadd order cancel 1529993230 8062614094334846949 redis...

Linux GPIO系統內呼叫(適用於初學者)

本方法是linux系統中操作gpio的通用方法,初學者或硬體工程師可以通過該方法對晶元的gpio口進行簡單的控制。在linux核心中進入路徑 sys class gpio 在該路徑下有export和unexport 2個節點,其分別的作用為 export 建立gpio控制節點。unexport 刪除...

Redis適用於高併發的遞增 遞減功能

遞增指令 incr 預設從0開始 遞減指令 decr 預設從0開始,遞減會出現負數,這點跟memcache不一樣,mc到0 如下 附上shardedjedispool和jediscluster的兩種實現方式 shardedjedispool override public long decr str...