Redis 事務(悲觀鎖 樂觀鎖)

2021-10-20 07:15:42 字數 2742 閱讀 3612

1、定義:

redis事務是乙個單獨的隔離操作

①事務中所有的命令都會被序列化、按照順序執行

②事務在執行過程中不會被其他客戶端傳送來的命令請求打斷

2、作用:

串聯多個命令防止別的命令插隊

multi:輸入開始命令

exec:執行命令

discard:放棄組隊(刪除掉)

3、注意事項:1、multi 命令不能巢狀使用,如果已經開啟了事務的情況下,再執行 multi 命令,會提示如下錯誤:

127.0

.0.1:6379

> multi

ok127.0

.0.1:6379

> multi

(error) err multi calls can not be nested //這裡報錯不會使事務終止

127.0

.0.1:6379

>

set a 100

queued

127.0

.0.1:6379

>

exec

1) ok

但是這個錯誤不會使事務終止

2、 如果在組隊**現了報告錯誤,執行時整個佇列都會被取消掉(當前事務就會終止), 比如multi巢狀就是組隊的時候報告錯誤

3、 如果在執行階段某個命令出現錯誤,只有報錯的命令不會被執行,其他的命令照常執行,不會回滾

127.0

.0.1:6379

> multi //開啟事務

ok127.0

.0.1:6379

>

set a 123

queued

127.0

.0.1:6379

> lpop a //使用list命令操作set型別

queued

127.0

.0.1:6379

>

exec

//執行

1) ok //正常的命令執行成功2)

(error) wrongtype operation against a key holding the wrong kind of

value

//錯誤的命令執行失敗

4、悲觀鎖:

.

每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖 ,這樣別人想拿這個資料就會block(阻塞)直到他拿到鎖

傳統的關係型資料庫裡面就是用到了很多這樣的鎖機制 (行鎖、表鎖、讀鎖、寫鎖都是在操作之前先上鎖)

樂觀鎖:

每次去拿資料的時候都認為別人不會修改,所以不會上鎖 ,但是在更新的時候會判斷一下在此期間別人會不會更新這個資料,可以用版本號等機制.例:

比如當前有乙個人,想修改一張5000塊的銀行卡,卡的版本名為v1,他修改完成後順便將銀行卡改個版本名字叫v2,那麼當另外乙個人來修改這個版本名為v1這張卡的時候,就發現沒有v1這張卡,不是不存在,是因為已經被上乙個人將版本名v1改為v2了。

.樂觀鎖適用於多讀的應用型別,提高吞吐量

redis就是利用這種check-and-set機制實現事務的

5、常用命令:

watch key [key…]

在執行multi之前,先執行watch key1 【key2】,可以監視乙個或者多個key,如果在事務執行之前這個(或這些)key被其他命令所改動,那麼事務將被打斷,(但是,相同的客戶端可能會在事務內部修改這些鍵,此時這個事務不會中止執行。)否則,redis根本就不會進入事務。類似於樂觀鎖得機制,我不上鎖,但是你修改不了,只能我自己改,我自己改,毫無影響,你要硬來改,我就報錯。

.unwatch

取消wtach命令對所有key的監視,如果在執行watch命令之後,exec命令或者discard命令先被執行了的話,那麼就不需要再執行unwatch命令了

6、redis事務三大特性:

.

1、單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷。

.2、沒有隔離級別的概念:佇列中的命令沒有提交之前都不會實際的被執行,因為事務提交前任何指令都不會被實際執行,也就不存在」事務內的查詢要看到事務裡的更新,在事務外查詢不能看到」這個讓人萬分頭痛的問題

.3、不保證原子性:redis同乙個事務中如果有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾

7、redis事務秒殺場景問題

秒殺

1、解決超賣問題:主要是通過 watch 監視 ,利用watch的特性,監視的值發生變化,事務就終止

.2、庫存遺留問題:利用lua指令碼

Redis09 事務(悲觀鎖 樂觀鎖)

redis事務是乙個單獨的隔離操作 事務中所有的命令都會被序列化 按照順序執行 事務在執行過程中不會被其他客戶端傳送來的命令請求打斷 串聯多個命令防止別的命令插隊 每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖 這樣別人想拿這個資料就會block 阻塞 直到他拿到鎖 傳統的關係型...

Redis鎖,悲觀鎖和樂觀鎖

樂觀鎖開啟事務前,設定對資料的監聽 watch exec時,如果發生資料發生過修改,作用於改資料的事務會自動取消 discard 事務exec後,無論成敗,監聽會被移除 悲觀鎖每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖。場景 如果專案中使用了快取且對快取設定了超時時間。當併發...

Redis事務 樂觀鎖和悲觀鎖詳細介紹

mysql acid。要麼同時成功,要麼同時失敗。redis事務本質 一組命令的集合。乙個事務中的所有命令都會被序列化,在事務執行過程中,會按照順序執行。一次性,順序性,排他性,執行一系列的命令。redis事務沒有隔離級別的概念 所有的命令在事務中,並沒有直接被執行。只有發起執行命令的時候才會執行。...