Redis實現樂觀鎖

2021-10-06 15:29:49 字數 1502 閱讀 6113

悲觀鎖:

樂觀鎖:

127.0.0.1:6379> set money 100

ok127.0.0.1:6379> set out 0

ok127.0.0.1:6379> watch money # 監事 money 物件

ok127.0.0.1:6379> multi # 事務正常結束,資料期間沒有發生變動,這個時候就正常執行成功

ok127.0.0.1:6379> decrby money 20

queued

127.0.0.1:6379> incrby out 20

queued

127.0.0.1:6379> exec

1) (integer) 80

2) (integer) 20

127.0.0.1:6379> set money 100

ok127.0.0.1:6379> set out 0

ok

開啟兩個客戶端

客戶端1:

127.0.0.1:6379> watch money            # 監事 money

ok127.0.0.1:6379> multi

ok127.0.0.1:6379> decrby money 10

queued

127.0.0.1:6379> incrby out 10

queued

此時執行客戶端2:

127.0.0.1:6379> get money

"100"

127.0.0.1:6379> set money 1000

ok

回來執行客戶端1:

127.0.0.1:6379> exec        # 執行之前,另外乙個執行緒修改了值。這個時候就會導致事務執行失敗!

(nil)

客戶端1發現事務執行失敗,就先解鎖 ,再監視

127.0.0.1:6379> unwatch            # 如果發現事務執行失敗,就先解鎖

ok127.0.0.1:6379> watch money # 獲取最新的值,再次監視

ok127.0.0.1:6379> multi

ok127.0.0.1:6379> decrby money 10

queued

127.0.0.1:6379> incrby out 10

queued

127.0.0.1:6379> exec # 比對監視的值有沒有發生變化

1) (integer) 990

2) (integer) 10

總結:watch 監視 money 的值,如果沒有發生變化,就執行成功;一旦發生變化,事務就執行失敗

redis實現樂觀鎖

redis測試監控 正常執行成功!127.0.0.1 6379 set money 100 ok127.0.0.1 6379 set out 0 ok127.0.0.1 6379 watch money 監視money物件 ok127.0.0.1 6379 multi ok127.0.0.1 637...

使用Redis實現樂觀鎖

事務是乙個單獨的隔離操作 事務中的所有命令都會序列化 按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷。事務是乙個原子操作 事務中的命令要麼全部被執行,要麼全部都不執行。這點和mysql的事務不太一樣,在mysql事務開啟後,當操作中存在異常,則會導致事務回滾,不會出現資料異...

redis事務以及實現樂觀鎖

一組命令的集合,單條命令是可以保證原子性的,但是事務不保證原子性。乙個事務中的所有命令都會被序列化,在事務執行過程中,會按照順序執行。一次性 順序性 排他性的執行一些命令。佇列 set get set 執行 redis事務沒有隔離級別概念。所有命令在事務中,並沒有直接被執行,只有發起執行命令 exe...