亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis緩存中的事務處理講解

發布時間:2021-08-27 14:09:48 來源:億速云 閱讀:139 作者:chen 欄目:web開發

這篇文章主要介紹“Redis緩存中的事務處理講解”,在日常操作中,相信很多人在Redis緩存中的事務處理講解問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Redis緩存中的事務處理講解”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

從數據庫事務說起

 通常我們提及數據庫都不可避免的要提到事務,那么什么是事務呢?事務是指作為單個邏輯工作單元執行的一系列操作。所以,首先事務是一系列操作,這一系列操作具有二態性,即完全地執行或者完全地不執行。因此事務處理可以確保除非事務單元內的所有操作的成功完成,否則不會***更新面向數據的資源。我們這里舉一個例子,數據庫中除查詢操作以外,插入(Insert)、刪除(Delete)和更新(Update)這三種操作都會對數據造成影響,因為事務處理能夠保證一系列操作可以完全地執行或者完全不執行,因此在一個事務被提交以后,該事務中的任何一條SQL語句在被執行的時候,都會生成一條撤銷日志(Undo  Log),而撤銷日志中記錄的是和當前擦作完全相反的操作,比如刪除的相反操作是插入,插入的相反操作是刪除等。我們通常所說的事務回滾其實就是去執行這些插銷日志里的相反操作,這同樣告訴我們一個道理,只有事務中的一系列操作完全執行的情況下可以回滾,如果是在意外情況下導致事務中的一系列操作沒有完全執行,這個時候我們是不能保證數據一定可以回滾的。

 在數據庫相關理論中,一個邏輯工作單元想要成為事務,就必須滿足ACID,即原子性、一致性、隔離性和持久性。(1):原子性這個概念其實就是指,一個事務內的所有SQL操作都是一個整體,因此只有所有的SQL操作都完全執行成功,該事務方可以認為提交成功。如果在提交事務過程中某一條SQL語句執行失敗,則整個事務必須回滾到事務提交前的狀態。(2):而一致性這個概念則是指,事務在完成的時候,必須要保證所有的數據都保持一致的狀態,而落實到數據庫的各個組成部分上,則要求開發人員能夠保證數據、索引、約束、日志等在事務前后具備一致性。(3):隔離性這個概念主要針對并發,其核心思想就是不同的并發事務對數據產生的修改必須是相互隔離的,假設有兩個不同的事務A和B并發執行,那么對A來講,它在執行前的狀態只有兩種,即B執行前和B執行后。同理,對B來講同樣是如此,這樣的特性我們就稱為隔離性。(4):持久性相對簡單,是指事務完成以后它對數據的影響是***性的。

Redis中的事務處理

 好了,截止到目前為止,我們對數據庫中事務處理的相關理論有了一個基本的認識,或許這個世界上的數據庫系統千差萬別,但我相信在事務處理這個問題上它們最終會殊途同歸,就像我們解決并發過程中的沖突問題,常規的做法依然是加鎖一樣,這是我之所以要花費精力去理解和解釋這些理論知識的原因,技術可謂是日新月異,如果我們總是一味地為新技術而疲于奔命,那么或許我們會漸漸地失去對這個行業的熱愛,我相信原理永遠比框架更為重要,沒有系統學習過計算機專業的課程,這件事情讓我至今都頗為遺憾。Redis中的事務是可以視為一個隊列,即我們可以通過MULTI開始一個事務,這相當于我們聲明了一個命令隊列。接下來,我們向Redis中提交的每條命令,都會被排入這個命令隊列。當我們輸入EXEC命令時,將觸發當前事務,這相當于我們從命令隊列中取出命令并執行,所以Redis中一個事務從開始到執行會經歷  開始事務 、 命令入隊 和 執行事務 三個階段。下面是一個在Redis中使用事務的簡單示例:

127.0.0.1:6379> MULTI OK 127.0.0.1:6379> SET Book_Name "GIt Pro" QUEUED 127.0.0.1:6379> SADD Program_Language "C++" "C#" "Jave" "Python"  QUEUED 127.0.0.1:6379> GET Book_Name QUEUED 127.0.0.1:6379> EXEC 1) OK 2) (integer) 4 3) "GIt Pro"

我們可以注意到Redis中的事務和通常意義上的事務基本上是一致的,即

  • 事務是由一系列操作組成的單個邏輯工作執行單元。特別地,因為在Redis中命令是存儲在一個隊列中,所以,事務中的所有命令都會按順序執行,并且在執行事務的過程中不會被客戶端發送的其它命令中斷。

  • 事務是一個原子操作,事物中的命令只有兩種執行結果,即全部執行或者全部不執行。如果客戶端在使用MULTI命令開啟事務后因為意外而沒有執行EXEC命令,則事務中的所有命令都不會執行。同理,如果客戶端在使用MULTI命令開啟事務后執行EXEC命令,則事務中的所有命令都會執行。

  • Redis中的事務可以使用DISCARD命令來清空一個命令隊列,并放棄對事務的執行。如果命令在入隊時發生錯誤,Redis將在客戶端調用EXEC命令時拒絕執行并取消事務,但是在EXEC命令執行后發生的錯誤,Redis將選擇自動忽略。

我們知道,常見的并發控制方案主要有悲觀鎖和樂觀鎖兩種方案,這里首先來解釋下這兩種概念。所謂悲觀鎖,顧名思義是一種悲觀的策略,悲觀鎖認為:在對任何記錄做修改前都應該加鎖,如果加鎖失敗則表明該機錄正在被修改,此時應該拋出異常;如果加鎖成功則修改記錄并在事務完成后解鎖;如果有其它人修改則應該等待當前修改解鎖或者是拋出異常。而所謂樂觀鎖,顧名思義是一種樂觀的策略,樂觀鎖認為:每次從記錄中查找數據別人都不會修改,因此這個過程中不需要加鎖,但是在更新記錄的時候,會通過版本號來判斷別人是否修改過當前記錄。

通常來講,樂觀鎖適合在寫沖突相對較少的場合下,悲觀鎖適合在寫沖突相對較多的場合下。Redis中提供了一種稱為check-and-set的機制,該機制主要通過WATCH命令來實現,其原理正是基于樂觀鎖的策略,Redis會在執行EXEC命令前檢查被監視的鍵對應的值是否發生變化,如果該值發生變化表明有人修改過這個鍵中存儲的值,此時Redis將會自動取消當前事務。我們來看這個簡單的例子:

WATCH Record_Count val = GET Record_Count val = val + 1 MULTI SET Record_Count $val EXEC

在這個例子中,我們嘗試在事務中對Record_Count做一個自增操作,這段代碼在非并發的情況下是沒有問題的,可是在并發的情況下,如果在執行EXEC命令前有一個用戶修改了Record_Count的值,那么我們此時的結果就會比期望的結果小1,現在我們有了WATCH,Redis就會對Record_Count進行監聽,當Redis監聽到該值發生變化的時候,這個事務就會被自動取消,進而避免造成沖突。

如何管理Redis的鍵

 其實從切題的角度來講,這篇博客基本上說清楚了事務處理問題,因此這篇博客雖然沒有給大家帶來多少驚喜,卻依然可以非常恰到好處的結題,可是因為之前有朋友在博客中留言并問到Redis的鍵管理的問題,所以博主決定在這里簡單的討論下這個問題,鑒于博主和大家一樣都是感剛接觸Redis,所以下面的觀點僅僅是一家之言,如果有疑問可以在博客中留言,歡迎大家批評指正。我認為Redis中的鍵的管理,基本上有兩種策略,即惰性刪除和定期刪除,而實際上這正是Redis默認的鍵刪除策略:

redis使用 惰性刪除 和 定期刪除  兩種策略來刪除過期的鍵:惰性刪除策略在碰到過期鍵時方進行刪除操作,定期刪除策略則每隔一段時間主動查找并刪除過期鍵。

所以,基于這兩種鍵刪除策略,我們可以想到的做法有:

  • 對于臨時變量可以采用臨時鍵來存儲,在數據庫全局設定一個過期時間,由Redis在鍵過期后自動刪除。

  • 對于持久化數據可以采用普通鍵來存儲,通過服務器和客戶端間定義協議來由客戶端主動刪除鍵。

  • 對于不同模塊中的鍵采取統一規范的命名規則來命名鍵,從而解決Redis中鍵管理混亂的問題。

設計合理的鍵回收機制,避免Redis使用超過95%以上的內存,或者通過設置Redis中的***內存容量及其內存策略來主動觸發Redis對鍵的淘汰。

到此,關于“Redis緩存中的事務處理講解”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亳州市| 裕民县| 扎鲁特旗| 郯城县| 武威市| 布尔津县| 馆陶县| 梓潼县| 江津市| 廉江市| 浦江县| 苗栗县| 铅山县| 安泽县| 斗六市| 上栗县| 通道| 濉溪县| 洛隆县| 正蓝旗| 阳新县| 青岛市| 申扎县| 彩票| 吉安市| 全州县| 普安县| 营口市| 东乡族自治县| 和顺县| 新干县| 浙江省| 宣威市| 铜梁县| 辉县市| 廉江市| 穆棱市| 盘山县| 全州县| 喀喇| 樟树市|