Redis 學習之事務處理

来源:http://www.cnblogs.com/jalja/archive/2017/02/20/6416400.html
-Advertisement-
Play Games

Redis目前對事物的支持相對簡單。Redis只能保證一個client發起的事務中的命令可以連續的執行,而中間不會插入其他的client命令。當一個client在一個鏈接中發出multi命令時,這個鏈接會進入一個事務上下文,該連接後續的命令不會立即執行,而是先放到一個隊列中,當執行exec命令時,r... ...


 

該問使用centos6.5 64位  redis3.2.8

 

Redis事務機制

   在MySQL等其他資料庫中,事務表示的是一組動作,這組動作要麼全部執行,要麼全部不執行。 

 Redis目前對事物的支持相對簡單。Redis只能保證一個client發起的事務中的命令可以連續的執行,而中間不會插入其他的client命令。當一個client在一個鏈接中發出multi命令時,這個鏈接會進入一個事務上下文,該連接後續的命令不會立即執行,而是先放到一個隊列中,當執行exec命令時,redis會順序的執行隊列中的所有命令。

Multi 開啟事務:
127.0.0.1:6379[1]> multi #開啟事務
OK
127.0.0.1:6379[1]> set age 15 #數據操作命令
QUEUED
127.0.0.1:6379[1]> set age 20  #數據操作命令
QUEUED
127.0.0.1:6379[1]> exec  #執行事務
1) OK
2) OK
127.0.0.1:6379[1]> get age
"20"
Discard:取消事務,該命令實際是清空事務隊列中的命令並退出事務上下文,也就是事務回滾。
127.0.0.1:6379[1]> get age
"20"
127.0.0.1:6379[1]> multi 
OK
127.0.0.1:6379[1]> set age 25
QUEUED
127.0.0.1:6379[1]> set age 30
QUEUED
127.0.0.1:6379[1]> discard #清空事務隊列
OK
127.0.0.1:6379[1]> get age
"20"

註意redis事務問題:通常事務隊列中如果有一個事務失敗則整個事務都會回滾,但在redis中其他事務命令不會回滾。

 

 

 樂觀鎖:redis大多數是基於數據版本(version)的記錄機制實現的。即為數據增加一個版本標識,在基於資料庫表的版本解決方案中,一般是通過為資料庫表添加一個version欄位來實現。在讀取數據時,將此版本號一同讀出,之後更新時對此版本號加1。此時,將提交數據的版本號與資料庫表對應記錄的當前版本號進行對比,如果提交的數據版本號大於資料庫當前版本號,則予以更新,否則認為是過期數據。

watch監控:watch命令會監控給定的key,當exec時如果監視的key從調用watch後發生過變化,則整個事務會失敗。也可以調用watch多次監視多個key,這樣就對指定事務key加樂觀鎖了。註意watch的key是對整個鏈接有效的,事務也一樣。如果鏈接斷開,監視和事務都會被自動清除。當然exex、discard、unwatch命令都會自動清除鏈接中的所有監視。

在redis中對樂觀鎖的實現:

假設有一個age的key,我們開啟兩個session來對age進行賦值操作。

session1:

127.0.0.1:6379> get age
"10"
127.0.0.1:6379> watch age #打開對age鍵的監控(監控其他操作是否對age鍵有修改操作)
OK
127.0.0.1:6379> multi #開啟事務上下文
OK

session2:

127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get age
"20"

在session2中直接操作age

再看session1:

127.0.0.1:6379> set age 30 #在session2中操作age後,我們在session1中繼續操作age
QUEUED
127.0.0.1:6379> exec #執行事務 返回nil 事務執行不成功。
(nil)
127.0.0.1:6379> get age
"20"

在這裡我們發現事務不能執行成功,這就是因為session1中的數據版本已經小於資料庫中的數據版本。這就是redis中的樂觀鎖。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • stat path [watch] set path data [version] ls path [watch] delquota [-n|-b] path ls2 path [watch] setAcl path acl setquota -n|-b val path history redo ...
  • 一、以一行數據的形式,顯示本年的12月的數據,本示例以2017年為例,根據CreateDate欄位判斷,計算總和,查詢語句如下: 查詢結果如下: 二、根據當前日期,以列的數據形式,顯示本年的12個月的數據,查詢語句如下: 查詢結果如下: 二、具體應用示例:以2017為例,查詢語句如下: 查詢結果如下 ...
  • ,不要建output文件夾 好像這兩個圖片顯示不出來了 12:44:34,422 WARN NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java class ...
  • 1.打開"終端視窗",輸入"sudo apt-get update"-->回車-->"輸入當前登錄用戶的管理員密碼"-->回車,就可以了。 2.打開"終端視窗",輸入"sudo apt-get install openssh-server"-->回車-->輸入"y"-->回車-->安裝完成。 3.打 ...
  • 1、Redis是一個支持持久化的記憶體資料庫,redis會經常將記憶體中的數據同步到硬碟上來保證數據持久化,從而避免伺服器宕機數據丟失問題,或者減少伺服器記憶體消耗提高性能。 2、Redis的虛擬記憶體與操作系統中的虛擬記憶體不是一回事,但思路相同。就是將不經常訪問的數據從記憶體交換到磁碟中,從而騰出寶貴的記憶體... ...
  • binlog2sql是大眾點評開源的一款用於解析binlog的工具,在測試環境試用了下,還不錯。 其具有以下功能 1. 提取SQL 2. 生成回滾SQL 關於該工具的使用方法可參考github操作文檔:https://github.com/danfengcao/binlog2sql 個人感覺該文檔已 ...
  • 轉載:http://www.cnblogs.com/djcsch2001/articles/1823459.html 索引,索引的建立、修改、刪除 索引索引是關係資料庫中用於存放每一條記錄的一種對象,主要目的是加快數據的讀取速度和完整性檢查。建立索引是一項技術性要求高的工作。一般在資料庫設計階段的與 ...
  • 將hdfs里name與data清空,和將tmp清空 然後在hadoop目錄下運行 hadoop namenode -format 啟動 sbin/start-all.sh ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...