大数据之Redis:悲观锁和乐观锁
目錄
- 1、悲觀鎖
- 2、樂觀鎖
- 3、事務(wù)沖突的問題
- 4、客戶端事務(wù)操作
1、悲觀鎖
悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖,這樣別人想拿這個(gè)數(shù)據(jù)就會(huì)block直到它拿到鎖。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
2、樂觀鎖
樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖,但是在更新的時(shí)候會(huì)判斷一下在此期間別人有沒有去更新這個(gè)數(shù)據(jù),可以使用版本號(hào)等機(jī)制。樂觀鎖適用于多讀的應(yīng)用類型,這樣可以提高吞吐量。Redis就是利用這種check-and-set機(jī)制實(shí)現(xiàn)事務(wù)的。
3、事務(wù)沖突的問題
兩個(gè)請(qǐng)求
一個(gè)請(qǐng)求想給金額減8000
一個(gè)請(qǐng)求想給金額減5000
一個(gè)請(qǐng)求想給金額減1000
悲觀鎖:
樂觀鎖:
4、客戶端事務(wù)操作
1、正常執(zhí)行
127.0.0.1:6379> MULTI #開啟事務(wù) OK 127.0.0.1:6379> set k1 v1# 命令入隊(duì) QUEUED 127.0.0.1:6379> set k2 v2 QUEUED 127.0.0.1:6379> get k2 QUEUED 127.0.0.1:6379> set k3 v3 QUEUED 127.0.0.1:6379> EXEC# 執(zhí)行事務(wù) 1)OK# 輸出結(jié)果 2)OK 3)OK 4)OK 127.0.0.1:6379>2、放棄事務(wù)
127.0.0.1:6379> MULTI #開啟事務(wù) OK 127.0.0.1:6379> set k1 v1# 命令入隊(duì) QUEUED 127.0.0.1:6379> set k2 22 QUEUED 127.0.0.1:6379> set k3 33 QUEUED 127.0.0.1:6379> DISCARD#取消事務(wù) OK 127.0.0.1:6379> get k2#數(shù)據(jù)未被改動(dòng)"v2"3、若在事務(wù)隊(duì)列中存在命令性錯(cuò)誤(類似java編譯性錯(cuò)誤),則執(zhí)行EXEC命令時(shí),所有命令都不回執(zhí)行
127.0.0.1:6379> MULTI #開啟事務(wù) OK 127.0.0.1:6379> set k1 v1# 命令入隊(duì) QUEUED 127.0.0.1:6379> set k2 v2 QUEUED 127.0.0.1:6379> set k3 v3 QUEUED 127.0.0.1:6379> getset k3 #錯(cuò)誤命令 (error)ERR wrong number of arguments for 'getset' command 127.0.0.1:6379> set k4 v4 QUEUED 127.0.0.1:6379> set k5 v5 QUEUED 127.0.0.1:6379> EXEC# 執(zhí)行事務(wù),報(bào)錯(cuò) (error)EXECABORT Transaction discard because of previous errors. 127.0.0.1:6379> get k5#命令未執(zhí)行 (nil)4、若在事務(wù)對(duì)列中存在語法性錯(cuò)誤(類似于java的1/0的運(yùn)行時(shí)異常)則執(zhí)行EXEC命令時(shí),其他命令會(huì)被執(zhí)行,錯(cuò)誤命令拋出異常
127.0.0.1:6379> MULTI #開啟事務(wù) OK 127.0.0.1:6379> incr k1 #對(duì)k1(值為v1)進(jìn)行+1 QUEUED 127.0.0.1:6379> set k2 22 QUEUED 127.0.0.1:6379> set k3 33 QUEUED 127.0.0.1:6379> set k4 v4 QUEUED 127.0.0.1:6379> get k4 QUEUED 127.0.0.1:6379> EXEC# 執(zhí)行事務(wù),報(bào)錯(cuò) 1)(error)ERR value is not an integer or out of range 2)OK 3)OK 4)OK 5)"V4"總結(jié)
以上是生活随笔為你收集整理的大数据之Redis:悲观锁和乐观锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Headroom.js
- 下一篇: 关于oracle11g下的demobld