Redis lesson13 Redis的事務機制

2021-08-08 15:27:07 字數 2613 閱讀 7961

1.redis中的事務簡介

2redis中的事務用途

3.redis中的事務 / redis中事務相關指令

4.redis事務命令流程 及 注意事項

5.redis事務相對於其他事務的一些特性與區別

1.redis中的事務簡介

可以一次執行多個命令,本質是一組命令的集合。

乙個事務中的所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,不許加塞.

2.redis中的事務用途

乙個佇列中,一次性、順序性、排他性的執行一系列命令

3.redis中的事務  /  redis中事務相關的指令

。。1 redis 中的事務

。。2 redis中事務相關的指令

。。1  redis中的事務

1)悲觀鎖

悲觀鎖(pessimistic lock), 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,

這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,

比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖

2)樂觀鎖

樂觀鎖(optimistic lock), 顧名思義,就是很樂觀,每次去拿資料的時候都認為別人不會修改,所以不會上鎖,

但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,可以使用版本號等機制。

樂觀鎖適用於多讀的應用型別,這樣可以提高吞吐量,

樂觀鎖策略:提交版本必須大於記錄當前版本才能執行更新

3)redis 中的鎖 watch

redis 的 multi watch 等指令本身並不提供加鎖的機制,需要通過watch 指令監控某些 key 完成加鎖的操作,

下面對watch 做個介紹

watch指令,類似樂觀鎖,事務提交時,如果key的值已被別的客戶端改變,

比如某個list已被別的客戶端push/pop過了,整個事務佇列都不會被執行

通過watch命令在事務執行之前監控了多個keys,倘若在watch之後有任何key的值發生了變化,

exec命令執行的事務都將被放棄,同時返回nullmulti-bulk應答以通知呼叫者事務執行失敗

。。2 redis 事務相關指令

discard 

取消事務,放棄執行事務塊內的所有命令。

exec 

執行所有事務塊內的命令。

multi 

標記乙個事務塊的開始。

unwatch 

取消 watch 命令對所有 key 的監視。

watch key [key ...] 

監視乙個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。

4.redis事務的命令流程 以及注意事項

**********=  注意事項

可以對redis的事務有以下總結:

按照場景分為 加鎖的場景 / 不加鎖的場景

case1 正常執行

case2 放棄事務 (discard)

case3 全體連坐

對於命令佇列中有命令拼寫錯誤等情況所有命令都失效

示例:

case4 冤頭債主  

命令可以正常加入佇列,但是其中一些命令存在錯誤直到執行才能檢測出來,

此時只有有問題的命令不能通過,其他命令正常執行

示例:

**********=== 事務的命令流程

1)不需要加鎖事務的流程

2)需要加鎖的事務的流程

1)不需要加鎖事務的流程

開啟:以multi開始乙個事務

入隊:將多個命令入隊到事務中,接到這些命令並不會立即執行,而是放到等待執行的事務佇列裡面

執行:由exec命令觸發事務

2)需要加鎖的事務的流程

1.watch 需要被修改的key

2.mulit開始事務

3.新增多個命令

4.exec命令觸發事務

5.unwatch -->取消所有key 上的監視器

6.根據返回值 確定是否有別的 程序 / 執行緒 在這段時間修改了變數

1)有執行緒對被監控的key,跳到 1

2)正常返回,完成整個流程

對需要加鎖場景的乙個演示 

5.redis中事務相對於其他事務的一些特性與區別

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

沒有隔離級別的概念:佇列中的命令沒有提交之前都不會實際的被執行,因為事務提交前任何指令都不會被實際執行,

也就不存在」事務內的查詢要看到事務裡的更新,在事務外查詢不能看到」這個讓人萬分頭痛的問題

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

redis 學習13 事務

redis單條命令是保證原子性的,而redis事務不保證原子性 redis事務的本質 一組命令的集合!乙個事務中的所有命令是會被序列化,在事務執行過程中,命令會按照順序執行!一次性!順序性!排他性!並沒有隔離級別的概念!redis事務 1,開啟事務 multi 2,命令入隊 其他命令 3,執行事務 ...

Redis(四)redis的事務

可以一次執行多個命令,本質是一組命令的集合。乙個事務中的 所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,不許加塞。乙個佇列中,一次性 順序性 排它性的執行一系列命令。開啟 以multi開始乙個事務 入隊 將多個命令入隊到事務中,接到這些命令並不會立即執行,而是放到等待執行的事務佇列裡面...

Redis中的事務

flushall清除所有的鍵值 1 multi 開啟事務,事務塊中的多條語句會按照順序放入佇列中。multi incr counter1 incr counter2 incr counter3 ping get counter1 2 exec 執行事務塊中的命令 3 watch 監視乙個或者多個ke...