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...