1. 程式人生 > >【Redis入門】-淺談redis事務

【Redis入門】-淺談redis事務

說到事務大家都不陌生,在關係型資料庫中,事務時併發控制的基本單位,他是一個操作的序列,可以包含多個指令,並且,對於一個事務,其內部的指令要麼全部執行,要麼都不執行,內部指令不可分割。

關係型資料庫的事務具有四個特性:

1. 原子性

2. 一致性

3. 隔離性

4. 永續性

而在我們redis資料庫中,事務回事什麼樣子的呢?

首先我們給出一個定義:redis的事務中,一次執行多條命令,本質是一組命令的集合,一個事務中所有的命令將被序列化,即按順序執行而不會被其他命令插入

在redis中,事務的作用就是在一個佇列中一次性、順序性、排他性的執行一系列的命令。

事務的生命週期:

1. 事務的建立:使用MULTI開啟一個事務

2. 加入佇列:在開啟事務的時候,每次操作的命令將會被插入到一個佇列中,同時這個命令並不會被真的執行

3. EXEC命令進行提交事務

常用的關於事務的命令有:

1. MULTI:使用該命令,標記一個事務塊的開始,通常在執行之後會回覆OK,(但不一定真的OK),這個時候使用者可以輸入多個操作來代替逐條操作,redis會將這些操作放入佇列中。

2. EXEC:執行這個事務內的所有命令

3. DISCARD:放棄事務,即該事務內的所有命令都將取消

4. WATCH:監控一個或者多個key,如果這些key在提交事務(EXEC)之前被其他使用者修改過,那麼事務將執行失敗,需要重新獲取最新資料重頭操作(類似於樂觀鎖)。

5. UNWATCH:取消WATCH命令對多有key的監控,所有監控鎖將會被取消。

注意:關於樂觀鎖等概念:

   樂觀鎖:就像他的名字,不會認為資料不會出錯,他不會為資料上鎖,但是為了保證資料的一致性,他會在每條記錄的後面新增一個標記(類似於版本號),假設A 獲取K1這條標記,得到了k1的版本號是1,並對其進行修改,這個時候B也獲取了k1這個資料,當然,B獲取的版本號也是1,同樣也對k1進行修改,這個時候,如果B先提交了,那麼k1的版本號將會改變成2,這個時候,如果A提交資料,他會發現自己的版本號與最新的版本號不一致,這個時候A的提交將不會成功,A的做法是重新獲取最新的k1的資料,重複修改資料、提交資料。

  悲觀鎖:這個模式將認定資料一定會出錯,所以她的做法是將整張表鎖起來,這樣會有很強的一致性,但是同時會有極低的併發性(常用語資料庫備份工作,類似於表鎖)。

那麼,現在我們來執行一次具體看看redis的事務機制:

首先我會開啟事務,並向資料庫中儲存4條資料,可以看到沒執行一條命令的時候都會顯示入隊,並不會返回執行結果,說明redis中在事務提交之前,其內部的所有命令將不會被執行:

那麼,如果中間有命令出錯了會怎樣呢?現在我隨便打幾個字元試一試:

可以看出,在第三條命令中我隨便打了幾個字元,提交事務的時候並沒有成功,這也很符合我們對事務的理解,嗯~具有原子性。但是,有一個細節,那就是錯誤命令在我輸入的時候就已經報錯了,也就是說這個條錯誤命令在進入佇列的時候redis就已經知道這是一條錯誤命令,這樣,整個事務的命令將全部失敗,那麼,有沒有一種可能某個錯誤指令在進入佇列的時候redis還沒有發現他的錯誤呢?我們試一試下面這個例子:

問題出現了,我們可以看到,name+1這條指令其實是錯誤的,但是提交事務的時候會發現,這條錯誤命令確實沒有執行,但是其他正確的命令卻執行,這是為什麼的?

原因是在redis中,對於一個存在問題的命令,如果在入隊的時候就已經出錯,整個事務內的命令將都不會被執行(其後續的命令依然可以入隊),如果這個錯誤命令在入隊的時候並沒有報錯,而是在執行的時候出錯了,那麼redis預設跳過這個命令執行後續命令。也就是說,redis只實現了部分事務。

下面我們來看看剛剛提到的鎖的問題,我們說過,redis的鎖CAS(check and set)類似於樂觀鎖,redis的實現原理是使用watch進行監視一個(或多個)資料,如果在事務提交之前資料發生了變化(估計使用了類似於樂觀鎖的標記),那麼整個事務將提交失敗,我們可以舉一個例子,我們開啟兩個終端,模擬兩個人的操作,設定一條資料為count,初始時100,現在A對其進行監控,並且為count增加20

在沒有提交之前,B也獲取了這個count,為其減少50,

那麼這個時候A如果提交事務,會出現失敗提示:

可以看到,在A對資料的修改過程中,B對資料進行了修改,那麼這條資料的“標記”就發生了變化,已經不是當初A取出資料的時候的標記了,這樣,A的事務也就提交失敗了。

最後通過上述的實驗,我們總結redis事務的三條性質:

1. 單獨的隔離操作:事務中的所有命令會被序列化、按順序執行,在執行的過程中不會被其他客戶端傳送來的命令打斷
2. 沒有隔離級別的概念:佇列中的命令在事務沒有被提交之前不會被實際執行
3. 不保證原子性:redis中的一個事務中如果存在命令執行失敗,那麼其他命令依然會被執行,沒有回滾機制

相關推薦

Redis入門-redis事務

說到事務大家都不陌生,在關係型資料庫中,事務時併發控制的基本單位,他是一個操作的序列,可以包含多個指令,並且,對於一個事務,其內部的指令要麼全部執行,要麼都不執行,內部指令不可分割。 關係型資料庫的事務具有四個特性: 1. 原子性 2. 一致性 3. 隔離性 4.

SqlServer系列SQL Server事務與鎖(上篇)

架構 tab 要求 允許 ble 1.2 定義 由於 數據庫引擎 一 概述 在數據庫方面,對於非DBA的程序員來說,事務與鎖是一大難點,針對該難點,本篇文章試圖采用圖文的方式來與大家一起探討。 “淺談SQL Server 事務與鎖”這個專題共分

遊戲開發遊戲開發中常見的設計原則

依賴關系 unity 說過 srp des log gof https 類繼承   俗話說得好:“設計模式,常讀常新~”。的確,每讀一遍設計模式都會有些新的體會和收獲。馬三不才,才讀了兩遍設計模式(還有一遍是在學校學的),屬於菜鳥級別的。這次準備把閱

SSH 基礎Hibernate關系映射(3)

區別 ack 增加 ans 存儲結構 mil pro 映射 方向 繼上篇博客 一對多關聯映射(單向) 上面我們介紹了多對一,我們反過來看一對多不就是多對一嗎?那還用再進行不同的映射嗎?有什麽區別嗎?一對多和多對一映射原理是一致的,存儲是同樣的。也就是生成的數據庫

專家專欄百度搜索排序

百度搜索排序站長圈經常聊的話題中,怎麽提升百度排序一定是排名TOP3的問題,那百度排序的原理是什麽,該怎麽提升,今天給大家分享一下經驗心得。關於排序這件事兒對於像百度搜索來說,並沒有排序這一說法,搜索引擎認為排序是在特定的關鍵詞下網站內容的位置,而關鍵詞是由用戶搜索產生,如果一個關鍵詞沒有被搜索,也就意味著這

幹貨分布式數據庫中間件之分庫分表

-o img 資源 註意 淺談 中間件 water 大數據 分離 分庫分表,顧名思義就是把原本存儲於一個庫的數據分塊存儲到多個庫上,把原本存儲於一個表的數據分塊存儲到多個表上。那麽關於分庫分表,你了解多少呢?接下來,我們將從什麽是數據分片及如何進行分片兩方面對DDM分庫分表

JavaScript系列JavaScript之函數(一)

php 面向過程 .com func fun 面向對象編程 quest ice bbf 在編程語言中,無論是面向過程的C,兼備面過程和對象的c++,還是面向對象的編程語言,如java,.net,php等,函數均扮演著重要的角色。當然,在面向對象編程語言JavaScript中

JavaScript系列JavaScript之函式(一)

       在程式語言中,無論是面向過程的C,兼備面過程和物件的c++,還是面向物件的程式語言,如java,.net,php等,函式均扮演著重要的角色。當然,在面向物件程式語言JavaScript中(嚴格來說,JS屬於弱面向物件程式語言),函式(function)更扮演著極其重要的角色和佔有極其重要的地位。

java筆記Java中的equals和==

在初學Java時,可能會經常碰到下面的程式碼: String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1==str2); System.out.

微服務微服務基建的邏輯

這篇文章主要目的是面向初接觸微服務的朋友簡單介紹微服務基礎建設所需要的各個模組以及緣由。 起點 首先,我們得有一個“服務”。根據定義,我們可以把每個服務例項都視作一個黑盒。這個盒子有著明確的輸入點和輸出點,並且(理想情況下)僅通過這些輸入和輸出點和外界產生關聯。每個服

掃盲貼38K紅外發射接受編碼(非常好)

http://blog.sina.com.cn/s/blog_4ca9659e0101i9nn.html 轉自Doctor_A 壇友的筆記!之前做接觸過一次紅外遙控器,現在有空想用簡單的話來聊一聊,下面有錯誤的地方歡迎改正指出:1:紅外的概念不聊,那是一種物理存在。以下聊

Unity教程Unity呼叫其他指令碼函式的方法(未完)

第一種,被呼叫指令碼函式為static型別,呼叫時直接用  指令碼名.函式名() 這種就是單例,簡單的單例的使用 如果程式碼過多,程式碼之間相互呼叫單例,每一次呼叫就會生成一個單例,如果程式碼過多, 就不方便程式碼的維護,造成程式效能的重要流失,因此不建議依賴使用單例 使用這種方法,必須在類的前面新增關鍵字

sql DB髒讀

【前言】        小編在做基礎系統維護的時候,接觸到了修改伺服器上的sql server資料庫裡面的資料,之前的時候小編也學過sql的東西,不過現在全忘了(增刪改查,這些基本的還是會的),在刪除

開發經驗flutter的優點與缺點

本文預設你已經是開發者,並對Flutter有基本的瞭解,但是還未深入使用,希望瞭解Flutter在商業級(而非demo)的專案中的優勢與劣勢。 很多前端開發者應該都尋找過跨平臺的App解決方案,包括沒有同時獨立開發iOS和Android雙端原生app的開發者,應該都

高等數學傅立葉級數與變換的理解(二)

目錄 有助理解傅立葉變換的幾個圖: 三角函式的疊加,如何得到方波:                   (時域上觀察) 時域特徵轉換到頻域特徵: 雜亂的週期波形訊號(如語音)可以轉換為規則的三角波型號的疊加: 1.傅立葉級數

工程化知識點持續整合與灰度釋出

一、持續整合       持續整合(Continuous integration,簡稱CI)是一種軟體開發實踐,即團隊開發成員經常整合它們的工作,通常每個成員每天至少整合一次,也就意味著每天可能會發生多次整合。每次整合都通過自動化的構建(包括編譯,釋出,自動化測試)來驗證,從而儘快地發現整合錯誤。許多團隊

掃盲貼38K紅外發射接受編碼

設計 筆記 有效 識別 一個 找到 波形 晶振 保持 轉自Doctor_A 壇友的筆記!之前做接觸過一次紅外遙控器,現在有空想用簡單的話來聊一聊,下面有錯誤的地方歡迎改正指出:1:紅外的概念不聊,那是一種物理存在。以下聊38K紅外發射接收,主要講可編程的紅外編碼。2:紅外遙

http協議

互聯 資源 管道機制 strong gecko 僅支持 郵件 and post 【http協議】淺談 一、 概述 http,超文本傳輸協議(HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網絡協議。 請求與響應: 客戶端發送請求,服務器

11結構型 外觀模式 理解與使用~

外觀模式 外觀模式,用於隱藏系統的複雜性,並且向客戶端提供一個可以操作訪問系統的介面,來隱藏系統的複雜性。   舉個例子: 好比系統就是我們手裡面的一臺電腦,我們都知道,電腦內部很複雜,但是我們操作的時候,就好比只需要摁一下開機按鈕,電腦就會啟動起來, 我們無需關注電腦是如何啟動起來的。這就好比一

資料結構主席樹

## 前置知識 ①線段樹 ②權值線段樹 ③桶的思想 ④字首和思想 (以上幾個前置知識我也希望我能有時間寫寫自己的部落格講解一下【如果有時間的話嗚噫嗚噫~) ## 模板題 先上幾道模板題壓壓驚,有從別的博主那裡piao來的,也有自己做到的~ 因為深刻感受到了,要學習一個東西,最好還是先看