1. 程式人生 > >跟我學Redis(17)—Redis事務詳解及例項

跟我學Redis(17)—Redis事務詳解及例項

前面有篇文章,簡單介紹了Redis事務。

Redis事務主要命令包括 MULTI、EXEC、WATCH 命令。本篇文章將詳細介紹事務以及Redis事務例項應用!

一、事務、悲觀鎖、樂觀鎖概述

簡單的說,事務就是為了存取資料庫中同一資料時不破壞操作的隔離性和原子性,從而保證資料的一致性。

一般資料庫,比如MySql是如何保證資料一致性的呢,主要是加鎖悲觀鎖。比如在訪問資料庫某條資料的時候,會用SELECT FOR UPDATE ,這MySql就會對這條資料進行加鎖,直到事務被提交(COMMIT),或者回滾(ROLLBACK)。如果此時,有其他事務對被加鎖的資料進行寫入,那麼該事務將會被阻塞,直到第一個事務完成為止。它的缺點在於

:持有鎖的事務執行越慢,等待解鎖的事務阻塞時間就越長。並且容易產生死鎖(前面有篇文章有講解死鎖)!

Redis為了儘可能的減少客戶端的等待時間,並不會使用悲觀鎖。而是使用樂觀鎖,主要通過WATCH命令進行監控,這樣客戶端就永遠都不會等待第一個取得鎖的客戶端,它們只需要在自己的事務執行失敗時進行重試就可以了。

監控什麼呢?我們暫且理解為監控版本號是否一致

比如,對一條資料開啟事務操作時,先獲取一個版本號,當事務提交的時候用此版本號與最新的版本號進行比對,如果版本號不一致,那麼就返回給客戶端,由客戶端決定如何操作。(通過版本號實現樂觀鎖的原理)

二、Redis事務例項

通過MULTI開啟一個事務,通過EXEC提交此事務,比如:


一次性提交的好處是,客戶端與服務端不必要每條命令都互動(耗費傳輸時間);一次性提交可以節省資源,提高效率!

所以客戶端,比如python通過 conn.pipline() 開啟一個通道,操作命令就像流水線一樣,最後一次性完成提交,從而提高執行效率,節約資源,減少伺服器壓力。稱之為流水線操作!

三、WATCH命令實現樂觀鎖

當有一個事務在操作一條資料(資源)的時候,為了避免其他事務也來操作此資料,導致髒資料。在第一個事務中對此資料執行WATCH(監控),這樣通過樂觀鎖來保證資料的一致性。

暫且理解Redis的WATCH是通過監控版本號實現樂觀鎖的!


對照上圖,在例項中展示如下:

客戶端1


客戶端2


四、客戶端對於事務失敗的處理

一般可以選擇再次執行此事務,從而保證業務的正常流轉。

當然,也可以不執行WATCH,這樣就是非事務型流水線操作。

五、關於效能的注意事項

redis自帶效能測試程式 redis-benchmark 命令。在不給定任何引數的情況下,redis-benchmark將使用50個客戶端進行效能測試。

我們可以讓程式在只使用一個客戶端進行測試

redis-benchmark -c 1 -q  


在一般情況下,對於只使用單個客戶端的redis-benchmark來說,根據被呼叫命令的複雜度,一個不使用流水線的客戶端的效能大概只有redis-benchmark所示效能的50%~60%


所以,為了提高redis效能,客戶端儘量通過連線池分配連線,並使用流水線事務進行操作;

掃一掃,通過微信也能學習


相關推薦

Redis17Redis事務例項

前面有篇文章,簡單介紹了Redis事務。 Redis事務主要命令包括 MULTI、EXEC、WATCH 命令。本篇文章將詳細介紹事務以及Redis事務例項應用! 一、事務、悲觀鎖、樂觀鎖概述 簡單的

Java程式設計師從笨鳥到菜鳥之八十五jquery愛之初體驗jquery

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

彙編暫存器和實體地址的形成

一、通用暫存器 對於一個彙編程式設計師來說,CPU中主要部件是暫存器。暫存器是CPU中程式設計師可以用指令讀寫的部件。程式設計師通過改變各種暫存器的內容來實現對CPU的控制。 不同的CPU,暫存器的個數、結構是不同的。8086CPU 有14個暫存器,每個暫存

JAVA5圖形化介面設計——佈局管理器之FlowLayout流式佈局

一、佈局管理器所屬類包 所屬類包 佈局管理器名稱 說明 Java.awt FlowLayout(流式佈局) 元件按照加入的先後順序按照設定的對齊方式從左向右排列,一

程式設計3

        很多人做軟體開發非常執著於技術本身,希望通過更少的程式碼解決最多的需求,這個想法本身是沒有錯的,但是應該有一個前提,就是程式碼的可維護性比程式碼的簡潔性重要。        如下面一段程式碼:            void   swap(int *x, i

程式設計5

    編寫軟體,一個工具總是包含幾個部分:    1)編寫原始碼的編輯器,是用來寫字的,就如一張紙,其目的是讓程式編寫者更加容易書寫程式,一般具有高亮度顯示關鍵字功能。我們也可以直接用任何不帶格式的文字編輯器書寫程式碼,用office-word一樣可以書寫程式,只是儲存時

[Gradle中文教程系列]-Gradle-附錄:gradle命令列

Gradle 命令列命令詳解,根據Gradle.2.13版本的help命令編寫而來. 引數 描述 -?, -h, –help 顯示幫助 - - ….. -a,

python標準庫常用模組-----------------------------time模組相關演示程式碼

要想了解time模組,我們需要首先了解一下時間的三種表現形式: 1.時間戳:當前距離1970年的秒數 2.格式化的字串:即2018年9月11日的這種表現形式 3.struct_time:元組時間,以元組的形式顯示時間,一共有九個元素 下面來介紹一下它具體的方法及示例程

跨站請求偽造CSRF 漏洞原理防禦方法

注:轉載請註明出自:https://blog.csdn.net/qq_36711453/article/details/83714380 跨站請求偽造:攻擊者可以劫持其他使用者進行的一些請求,利用使用者身份進行惡意操作。 例如:請求http://x.com/del.php?id=1 是一個刪

Hibernate52016——配置檔案核心API

1.Hibernate配置檔案詳解: 1.1 Hibernate對映配置檔案: 1 對映配置檔名稱和位置沒有固定要求 2 對映配置檔案中,標籤name屬性值寫實體類相關內容 class標籤name屬性值寫實體類的全路徑 id標籤和property的name屬性值寫實體類的屬性名稱

KNN--KD樹KD樹最近鄰演算法

之前blog內曾經介紹過SIFT特徵匹配演算法,特徵點匹配和資料庫查、影象檢索本質上是同一個問題,都可以歸結為一個通過距離函式在高維向量之間進行相似性檢索的問題,如何快速而準確地找到查詢點的近鄰,不少人提出了很多高維空間索引結構和近似查詢的演算法。     一般說來,索引結構中相似性查詢有兩種基本的方式:

17-SpringBoot之Redis——Redis流水線

SpringBoot之Redis(四)——Redis流水線 在預設的情況下, Redis 客戶端是一條條命令傳送給Redis 伺服器的,這樣顯然效能不高。在關係資料庫中我們可以使用批量,也就是隻有需要執行SQL 時,才一次性地傳送所有的SQL 去執行,這樣效能就提高了許多

二叉樹的儲存表示與實現陳銳,葛麗萍資料結構整理

1.二叉樹的順序儲存, 即用一維陣列按照從左到右,從上到下的順序依次儲存,分析計算可得每個節點的編號,類似於樹狀陣列。 適用於完全二叉樹。 儲存非完全二叉樹時,需要在一維陣列中將二叉樹不存在的結點位置空出,並用NULL填充。 2.二叉樹.的鏈式儲存 二叉樹的鏈式儲存結構 二叉

springboot二十五springboot-過濾器之攔截不需要走過濾器的連結使用方法

1.建立專案 springboot怎麼建立不多說了,前面部落格已經有講解,下面是我們建立好的專案目錄。 2.編寫程式碼 過濾器可以指定我們排除的引數exclusions,我們把需要隔離的url統一封裝在這裡,然後在webconfig配置filterReg.ad

springboot十八springboot-web-webjars和靜態資源對映規則

一.簡介 在使用springboot的web應用時,首先需要建立springboot應用,選擇我們自己需要的模組,springboot已經預設將這些場景配置好了,只需要在配置檔案指定少量的配置就可以執行起來。在使用之前我們需要了解自動配置的原理,可以參考跟我學s

springboot二十springboot-maven配置不同打包環境

1.Spring Profile Spring可使用Profile決定程式在不同環境下執行情況,包含配置、載入Bean、依賴等。 Spring的Profile一般專案包含:dev(開發), test(單元測試), qa(整合測試), prod(生產環境)。由s

redis--redis安裝

安裝gcc 關閉 鍵值對 oca 命令 客戶端 技術分享 安裝 images 安裝gcc yum install gcc 解壓命令:   tar -zxvf redi.tar.gz -C /usr/local 進入redis的client端   /usr/local/re

轉載.NET中使用RedisRedis 的主從復制

讀寫 博文 img jpg cnblogs bar 本機 tac spa   Redis跟MySQL一樣,擁有非常強大的主從復制功能,而且還支持一個master可以擁有多個slave,而一個slave又可以擁有多個slave,從而形成強大的多級服務器集群架構。     

Redis3---Redis事務

重新 返回 lsp 是什麽 行為 添加 很遺憾 app 持久 Redis事務 Redis 通過 MULTI 、EXEC、 DISCARD 和 WATCH 四個命令來實現事務功能。 MULTI :標記一個事務塊的開始。 EXEC: 執

RedisRedis高級

time elements 服務 退出 csv 提升 計算機 無需 incr 一Redis 數據備份與恢復 Redis SAVE 命令用於創建當前數據庫的備份。 語法 redis Save 命令基本語法如下: redis 127.0.0.1:6379>