事務transition
Redis事務的本質是一組命令的集合,一次執行多個指令,事務中所有命令都被序列化,其他客戶端提交的命令請求不會插入到事務執行命令序列中,簡單來說:要不全執行,要不全不執行,Redis中提供了簡單的事務功能,需要multi和exec兩個命令實作,
事務執行流程:
- 開啟事務(multi)
- 命令入隊(…)
- 執行事務(exec)| 取消事務(discard)
在Redis的事務中的命令出現不同錯誤時,處理機制也會有所差異:
編譯型例外(命令錯誤),事務中所有命令都不會執行,因為Redis沒有隔離級別的概念,佇列中的命令沒有提交之前都不會實際的被執行:

運行時例外(1/0),如果事務佇列中存在語法性錯誤,那么執行命令的時候,其它命令是可以正常執行的,錯誤命令拋出例外,由此看出Redis的單條命令保證原子性,但是事務并不保證原子性,不支持回滾功能,

鎖
在有些應用場景需要在事務之前,確保事務中的key沒有被其它客戶端修改過,才執行事務,否則不執行,著類似于樂觀鎖的概念,在Redis中也提供了相關實作方法:
- 監視、加鎖(watch)
- 取消監視、解鎖(unwatch)
樂觀鎖:
假設資料一般情況不會造成沖突(很樂觀,認為什么時候都不會出問題),在資料提交更新時正式對資料的沖突與否進行檢測,發現了沖突,發出錯誤資訊,讓用戶決定如何處理,適用于讀操作多的場景,可以提高程式的吞吐量,
為了避免資料庫的幻讀,業務處理時間過長,樂觀鎖不會刻意使用資料庫本身的鎖機制,而是依據資料本身來保證資料的正確性
實作方法:
當有多個執行緒在操控redis的時候,被watch監視的key值如果發生改變,正在進行的事務將會失敗,每次加鎖后都要進行解鎖,再加鎖去重新獲取最新的值
正常流程:

出現執行緒問題:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280334.html
標籤:其他
上一篇:docker 筆記一
下一篇:資料分析師-求職篇
