1. 程式人生 > 實用技巧 >redis--悲觀鎖、樂觀鎖

redis--悲觀鎖、樂觀鎖

悲觀鎖:

    很悲觀、認為什麼時候都會出問題、無論做什麼都加鎖、很影響效能

樂觀鎖:

    1.很樂觀、認為什麼時候都不會出問題、所以不上鎖。更新資料的時候去判斷下,在此期間是否有人修改這個資料。

    2.獲取version

    3.更新時比較version

watch (監控、實現樂觀鎖)

監控測試、正常執行:

my-redis:0>set money 100  ##########  設定餘額 100
OK

my-redis:0>set out 0    #######  設定花費  0
OK

my-redis:0>watch money  #####  watch  監控 餘額
OK my
-redis:0>multi ########## 開啟事務 OK my-redis:0>decrby money 20 ####### 餘額 -20 QUEUED my-redis:0>incrby out 20 ######## 花費 +20 QUEUED my-redis:0>exec ######## 執行事務 80 20 my-redis:0>get money ############ 正常 !資料期間沒有發生變動,這個時候就正常執行成功
80

my-redis:0>     

測試多執行緒修復值、使用樂觀鎖操作。(事務沒執行、執行前另一個執行緒改了餘額、監控的值發生變化、這時執行事務會失敗)

my-redis:0>get money  ####  獲取到餘額是80
80

my-redis:0>watch money  ##### 監控餘額
OK

my-redis:0>multi  #######開啟事務  (這時候另一個執行緒把餘額改成1000)
OK

my-redis:0>decrby money 10  ########餘額-10   
QUEUED

my-redis:0>incrby out 10  ########### 花費+10
QUEUED

my-redis:0>exec  #########  執行事務失敗,因為監控的餘額在執行之前已經被改了
null

怎麼解決:在事務執行失敗後,解鎖 unwatch ,2.再重新獲取鎖,執行 提交

my-redis:0>unwatch  #########解鎖
OK

my-redis:0>watch money  ######重新獲取鎖 監控
OK

my-redis:0>multi  ########開啟事務
OK

my-redis:0>decrby money 10
QUEUED

my-redis:0>incrby out 10
QUEUED

my-redis:0>exec  #########執行成功
990
30