Redis ①②-事務

在這里插入圖片描述

Redis 事務

先來看看 MySQL 事務的四大特性:

  • 原子性:將事務里的多個操作打包成一個整體,要么全部成功,要么全部失敗,失敗后會進行回滾操作。
  • 一致性:確保事務執行前后,其數據的整體變化一致。
  • 隔離性:并發執行事務或其他操作時,對數據訪問的隔離限制。
  • 持久性:事務完成后,對數據的修改持久化存儲。

Redis 的事務與 MySQL 的事務相比,是稍遜一籌的。Redis 事務的特性可以說只有一個:“原子性”

且 Redis 是否是真正的原子性還持有爭議。如果原子性按照 MySQL 事務的原子性定義,那么 Redis 事務其實是沒有原子性的。

Redis 事務的原子性,就行將多個操作打包成一個整體,要么全部執行,要么全都不執行。這里的全部執行是不保證成功的

這和 MySQL 事務原子性是不同的,除了執行過程中出現錯誤的命令外,其他命令都能正常執行,并且,Redis 事務是不支持回滾(roll back)操作的。這與 MySQL 的略有不同。

舊版本 Redis 官網上對于事務的介紹中有這么一句話:

Either all of the commands or none are processed, so Redis transactions is also atomic. The EXEC command…

但現在 Redis 官網把這句話給刪掉了,可見官方對于 Redis 事務的原子性也是比較虛的…

根據 MySQL 事務的四大特性,總結 Redis 事務的特性:

  • 弱化的原子性:Redis 沒有回滾機制,只能做到這些操作批量執行,不能做到某條操作失敗后就回到事務執行的初始狀態。
  • 不保證一致性:Redis 沒有回滾機制,也沒有 “約束”。MySQL 的一致性體現的是運行事務前和運行后,結果都是合理有效的,不會出現中間非法狀態。
  • 不需要隔離性:Redis 是單線程模型,并不存在并發執行事務的情況。
  • 不需要持久性:Redis 的數據主要還是保存在內存的,是否開啟持久化和 redis-server 有關,不在 Redis 事務的考慮范圍內。

Redis 事務的主要意義就是提供了一種將多個命令請求打包的功能。然后,再按順序執行打包的所有命令,并且不會被中途打斷。也就是當有其他客戶端也執行命令時,不會出現 “插隊” 的情況。

Redis 是如何實現事務的?在開啟事務時,Redis 會為當前客戶端額外創建一個隊列。后續的命令操作都將進入這個隊列,知道后續執行事務時,才將這些命令操作從隊列中取出,執行。

在 Redis 主線程執行隊列里的命令操作時,是不會處理其他客戶端的命令請求的,知道隊列的命令操作全部執行完畢。

MySQL 的事務確實非常強大,但是其在空間和時間上都花費了不小的資源和開銷,是做出了一定的犧牲的。

而 Redis 主要的特點就是操作簡單,速度快,性能高,常常作為 MySQL 服務器上游的緩存來使用。所以,其實并不需要像 MySQL 事務那樣的強大。

Redis 事務實際開發中使用的非常少,功能比較雞肋。往往用在那些會出現線程安全問題的地方,比如計數器等。且 Redis 是支持通過編寫 Lua 腳本來執行一系列的操作,這也看出是一種事務

事務命令

使用 MULTI 開啟事務,使用 EXEC 執行事務,使用 DISCARD 取消事務。

注意:開啟事務后,將一些命令發送給服務器時,這些命令并不會立即執行,只有輸入 EXEC 命令時,才會依此執行這些命令。

取消事務后,之前的發送給服務器的命令就都不會執行。

如果在開啟事務時,且已經有幾個命令發送給服務器了,此時服務器宕機了,那么就和 DISCARD 一樣,取消了事務。

redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379(TX)> SET name redis
QUEUED
redis 127.0.0.1:6379(TX)> SET age 18
QUEUED
redis 127.0.0.1:6379(TX)> EXEC
1) OK
2) OK
redis 127.0.0.1:6379>

來看這么一個場景:

  • 客戶端一:
redis 127.0.0.1:6379> SET k1 111 # 0??
redis 127.0.0.1:6379> MULTI # 1??
OK
redis 127.0.0.1:6379(TX)> SET k1 222  # 2??
QUEUED
redis 127.0.0.1:6379(TX)> EXEC # 4??
1) OK
redis 127.0.0.1:6379>
  • 客戶端二:
redis 127.0.0.1:6379> SET k1 333 # 3??

有上述兩個客戶端,按照后續的序號執行命令,也就是客戶端一在開啟事務后,發送服務器將 k1 設為 222 的命令,隨即客戶端二發送了 SET k1 333 命令并且執行了。最后客戶端一執行了事務。

直接看的話,感覺最后 k1 的結果是 333。但結果卻是 222。這是因為只有執行了 EXEC 命令,才會真正執行事務,之前的命令都只是進入了事務隊列,還沒有真正執行。所以,將 k1 設為 222 的命令是發生在客戶端二執行之后的。

針對上述場景,會導致最后的結果產生歧義。我們可以在執行事務前通過 WATCH 監聽 k1

WATCH 可以監聽某個 key 是否在執行事務之間,與開啟事務前的值有差異。如果監聽到值有變化,則不執行修改該 key 的命令。

UNWATCH 可以取消對某個 key 的監聽。

  • 客戶端一:
redis 127.0.0.1:6379> WATCH k1 # 0??
OK
redis 127.0.0.1:6379> SET k1 111 # 1??
OK
redis 127.0.0.1:6379> MULTI # 2??
OK
redis 127.0.0.1:6379(TX)> SET k1 222  # 3??
QUEUED
redis 127.0.0.1:6379(TX)> EXEC # 5??
(nil)
redis 127.0.0.1:6379>
  • 客戶端二:
redis 127.0.0.1:6379> SET k1 333 # 4??
OK
redis 127.0.0.1:6379>

通過上述操作,可以看到,客戶端一執行 EXEC 了后,返回 (nil),說明該事務沒有執行任何操作。最后 k1 的值也是 333。

這是因為其監聽到了 k1 的值發生了變化,所以不執行修改 k1 的命令。

WATCH 的實現

WATCH 的實現是基于 "樂觀鎖"的,通過 CAS 原子操作判斷 key 是否被修改。

在監聽某個 key 時,會為該 key 生成一個 “版本號”,后續有其他客戶端對該 key 進行修改時,會將該 key 的版本號增加。

在執行事務時,出現了對 key 進行修改的命令,會通過 CAS 操作判斷其版本號與最初 WATCH 時的版本號是否一致。如果一致,則執行命令,否則,放棄執行該命令。

至于為什么要是有版本號而不是直接使用 key 的值判斷,是為了避免 ABA 問題的出現。

Redis 中的 Lua 腳本,也能起到類似于事務的效果。官網上說,事務這里的任何能實現的效果,都可以使用 Lua 腳本替代。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86264.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86264.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86264.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Leetcode+JAVA+回溯

39.組合總和 給你一個 無重復元素 的整數數組 candidates 和一個目標整數 target ,找出 candidates 中可以使數字和為目標數 target 的 所有 不同組合 ,并以列表形式返回。你可以按 任意順序 返回這些組合。 candidates 中的 同一個 數字可以 無限制重復…

嘉訊科技:醫院電子病歷系統的關鍵性作用

電子病歷系統在現代醫療領域發揮著至關重要的作用。 電子病歷系統極大地提高了醫療效率。以往,醫生需要翻閱大量的紙質病歷,耗費時間和精力去查找關鍵信息。而電子病歷系統通過數字化的存儲和檢索方式,使得醫生能夠在短時間內獲取患者的完整病…

解決 Docker 里 DrissionPage 無法連接瀏覽器的問題,內含直接可用的Docker鏡像(DrissionPage 瀏覽器鏈接失敗 怎么辦?)

文章目錄 ?? 介紹 ???? 演示環境 ???? 報錯現象與診斷 ???? 源碼?? DrissionPage 報錯內容?? 手動啟動 Chrome 測試?? 原因分析與解決方案 ???? 為什么會這樣??? 解決辦法?? 推薦方案?? 測試?? 可直接使用的Docker鏡像 ???? 鏡像下載地址…

Mysql 數據庫中設備實時狀態表水平分表

一、 需求概述 在使用 Mysql 數據庫存儲設備上報日志時,存在一張設備實時狀態表,隨著時間推移,數據量變得十分龐大。為了更好地管理和查詢數據,提高數據庫性能,需要對該表進行水平分表操作。同時,存在分頁…

nginx的下載與安裝 mac

1. 下載 方法一:本地下載 鏈接:https://nginx.org/en/download.html(可直接搜官網) 下載到本地后,上傳到linux的某個文件夾中 方法二:直接linux上下載(推薦) wget -c http://ngi…

在 Mac 上配置 Charles,抓取 iOS 手機端接口請求

工具官網:https://www.charlesproxy.com/ Charles 激活碼 一、簡介 Charles 是一款強大的網絡抓包工具,支持 HTTP 和 HTTPS 協議,適用于調試手機 App、微信小程序、H5 頁面等網絡請求。 它能作為代理服務器,轉發并記錄本機及其他…

較大項目 git(gitee, github) 拉取失敗解決方法

問題描述 近期遇到了一個拉取一個比較大項目失敗的問題,229M這么大 每次都失敗 我在自己的PC上,只有極好的環境才能拉取,筆記本辦公熱點怎么都不行 解決辦法 后面通過https鏈接 首次會報錯,因為我輸入錯了gitee的username&am…

爬蟲中網絡知識基礎

HTTP(HyperText Transfer Protocol)和 HTTPS(HyperText Transfer Protocol Secure)是互聯網上用于傳輸網頁內容等數據的兩種主要協議,以下是它們的定義和基本工作原理: HTTP 定義 :HTTP 是一種…

安全工具-二進制安全-testssl.sh

1 需求 --openssl <PATH> &#xff1a;use this openssl binary (default: look in $PATH, $RUN_DIR of testssl.sh) --quiet&#xff1a;dont output the banner. By doing this you acknowledge usage terms normally appearing in the banner --severity <severity…

WHAT - 組件庫與 Storybook

文章目錄 什么是 Storybook&#xff1f;使用場景舉例快速上手教程&#xff08;React 為例&#xff09;1. 安裝 Storybook2. 創建一個 Story&#xff08;組件故事&#xff09;3. 啟動 Storybook 常用功能常見生態擴展示例&#xff1a;用 Args 和 Controls 動態控制 Props推薦資料…

魔音音樂 5.0.2 | 無損下載 同步網易云歌單UI美觀

魔音音樂是一款功能豐富的音樂播放軟件&#xff0c;提供高保真音質、智能推薦系統和用戶友好界面。其豐富的音樂庫幾乎覆蓋了所有類型的音樂&#xff0c;無論是流行歌曲還是小眾音樂&#xff0c;都能在這里找到。這款應用非常適合音樂愛好者使用&#xff0c;它不僅讓你享受高品…

云原生時代的中國答案:OLARDB、OceanBase與PostgreSQL的共生革命

以下是對阿里自研數據庫的全景式技術調查,重點梳理其產品體系、與PostgreSQL的技術關聯及發展歷程: 一、阿里自研數據庫全景圖譜 ??1. 核心自研產品?? ??數據庫名稱????類型????技術定位????與PostgreSQL關系????PolarDB??云原生分布式數據庫存儲計…

HTTP 請求方法與狀態碼

前言&#xff1a;構建可靠前端應用的 HTTP 通信基礎 在當今復雜的 Web 應用生態中&#xff0c;前端開發已遠超簡單的頁面構建&#xff0c;轉而成為與后端系統緊密交互的復雜體系。作為這一交互的核心機制&#xff0c;HTTP 協議承載著幾乎所有的前后端數據交換&#xff0c;其設…

WIFI原因造成ESP8266不斷重啟的解決辦法

一、報錯 報錯信息如下&#xff1a; 21:37:21.799 -> ets Jan 8 2013,rst cause:2, boot mode:(3,7) 21:37:21.799 -> 21:37:21.799 -> load 0x4010f000, len 3424, room 16 21:37:21.799 -> tail 0 21:37:21.799 -> chksum 0x2e 21:37:21.799 -> loa…

13.5-13.8. 計算機視覺【2】

文章目錄 13.5. 多尺度目標檢測13.5.1. 多尺度錨框13.5.2. 多尺度檢測13.5.3. 小結 13.6. 目標檢測數據集13.6.2. 讀取數據集13.6.3. 演示 13.7. 單發多框檢測&#xff08;SSD&#xff09;13.7.1. 模型13.7.1.1. 類別預測層13.7.1.2. 邊界框預測層13.7.1.3. 連結多尺度的預測13…

RSS解析并轉換為JSON的API集成指南

RSS解析并轉換為JSON的API集成指南 引言 隨著互聯網的發展&#xff0c;信息的傳播和共享變得越來越重要。RSS&#xff08;簡易信息聚合&#xff09;作為一種廣泛采用的格式&#xff0c;用于發布經常更新的內容&#xff0c;如博客文章、新聞頭條或播客等。它允許用戶訂閱這些內…

java數據類型詳解篇

1、8種基本數據類型 數據類型分類字節數內存位數是否最高位為符號位&#xff08;0正數1負數&#xff09;取值范圍&#xff08;數值形式&#xff09;取值說明byte整數類型18是-128 ~ 127-2^7 ~ 2^7 - 1 &#xff08;冪形式&#xff09;short整數類型216是-32,768 ~ 32,767-2^15…

vue 瀏覽器樣式警告:“unknown property name“

瀏覽器樣式警告&#xff1a;"unknown property name"&#xff0c;但在部分電腦上的瀏覽器又是沒有問題的。 這個問題因為沒有安裝sass或者less&#xff0c;卻直接使用了他的語法&#xff0c;比如嵌套樣式&#xff1a; body {/* 按鈕 */.el-button {background: lin…

postgresql DDL腳本

在PostgreSQL中&#xff0c;數據定義語言&#xff08;DDL&#xff09;腳本用于定義、修改或刪除數據庫的結構。DDL 操作包括創建表、修改表結構、刪除表等。以下是幾種常見的DDL操作示例以及如何在腳本中實現它們。 1. 創建表 CREATE TABLE employees (employee_id SERIAL PR…

C#語言入門-task3 :C# 語言的面向對象技術

C# 面向對象編程技術概述 C# 是一種現代化的面向對象編程語言&#xff0c;提供了豐富的特性來支持面向對象的編程范式。以下是 C# 中面向對象編程的核心概念和技術&#xff1a; 核心概念 1. 類與對象 類是對象的藍圖&#xff0c;定義了對象的屬性和行為。對象是類的實例。 …