Redis7——基礎篇(四)

?前言:此篇文章系本人學習過程中記錄下來的筆記,里面難免會有不少欠缺的地方,誠心期待大家多多給予指教。

基礎篇:

  1. Redis(一)
  2. Redis(二)
  3. Redis(三)

接上期內容:上期完成了Redis的持久化機制的學習。下面開始學習Redis的其他功能,話不多說,直接發車。


一、Redis事務

(一)、定義

Redis事務是一個單獨的隔離操作,它將多個命令打包成一個原子操作序列。在事務執行過程中,要么所有命令都被執行,要么都不執行。這確保了數據操作的一致性和完整性。事務中的命令會被依次放入隊列中,然后在執行階段按順序執行,不會被其它命令插入,不許加塞


(二)、Redis事務和常規事務區別

與傳統數據庫的事務相比,Redis事務有一些獨特之處。傳統數據庫事務通常支持 ACID 特性(原子性、一致性、隔離性、持久性),而 Redis 事務不僅不保證原子性,而且在隔離性方面也有所不同。

redis特性:

1單獨的隔離操作Redis的事務僅僅是保證事務里的操作會被連續獨占的執行,redis命令執行是單線程架構,在執行完事務內所有指令前是不可能再去同時執行其他客戶端的請求的。
2沒有隔離級別概念因為事務提交前任何指令都不會被實際執行,也就不存在”事務內的查詢要看到事務里的更新,在事務外查詢不能看到”這種問題了。
3不保證原子性Redis的事務不保證原子性,也就是不保證所有指令同時成功或同時失敗,只有決定是否開始執行全部指令的能力,沒有執行到一半進行回滾的能力
4排它性Redis會保證一個事務內的命令依次執行,而不會被其它命令插入。

(三)、實操

1、正常執行

使用MULTI開啟事務,EXEC執行事務。開啟事務之后的所有操作,都只是加入到操作隊列中,并沒有實際執行。

?


2、放棄事務

使用MULTI開啟事務,DISCARD放棄事務。


3、全部失敗


4、冤頭債主

與傳統事務數據庫區別,不一定要一起成功一起失敗,redis可以部分成功部分失敗。

INCRINCRBY命令操作只能是整數,所以這兩條命令失敗了,其他都成功了。


5、watch監控

樂觀鎖(Optimistic Lock),顧名思義,就是很樂觀,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據。樂觀鎖策略是提交版本必須?大于記錄當前版本才能執行更新。

悲觀鎖(Pessimistic Lock),顧名思義,就是很悲觀,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。

watch命令是一種樂觀鎖的實現,Redis在修改的時候會檢測數據是否被更改,如果更改了,則執行失敗。

5.1、正常情況


5.2、加塞情況

就是開啟對這個key監控后,另外一個redis也在操作這個key,那么這邊事務就會執行失敗。


5.3、watch小總結

在 Redis 事務中,WATCH命令用于監控一個或多個鍵,一旦被監控的鍵在事務執行之前被其他客戶端修改,那么當前事務將被取消,不會執行。

不過需要注意的是,一旦執行了EXEC命令,那么之前加的所有監控鎖都將取消,這意味著事務執行完成后,不再對監控的鍵進行監控。此外,退出Redis或者Redis宕機也會導致監控鎖取消,所以在實際應用中,需要合理把握監控鎖的生命周期,結合業務場景來確保數據操作的準確性和一致性。


(四)、事務小總結

redis的事務分為三步:

  1. 開啟:以MULTI開啟事務。
  2. 入隊:將多個命令入隊到事務中,接到這些命令并不會立即執行,而是放到等待執行的事務隊列里面。
  3. 執行:由EXEC命令觸發事務。

二、Redis管道

(一)、問題由來

Redis是一種基于客戶端-服務端模型以及請求/響應協議的TCP服務。一個請求會遵循以下步驟:

  1. 客戶端向服務端發送命令分四步(發送命令→命令排隊→命令執行→返回結果),并監聽Socker返回,通常以阻塞模式等待服務端響應。
  2. 服務端處理命令,并將結果返回給客戶端。

如果同時需要執行大量的命令,那么就要等待上一條命令應答后再執行,這中間不僅僅多了RTT(Round Time Trip,簡稱RTT,數據包往返于兩端的時間),而且還頻繁調用系統IO,發送網絡請求,同時需要redis調用多次read()和write()系統方法,系統方法會將數據從用戶態轉移到內核態,這樣就會對進程上下文有比較大的影響了,性能不太好。

Q&A?如何優化頻繁命令往返造成的性能瓶頸?

答:使用管道


(二)、定義

管道(pipeline)可以一次性發送多條命令給服務端,服務端依次處理完完畢后,通過一條響應一次性將結果返回通過減少客戶端與redis的通信次數來實現降低往返延時時間。pipeline實現的原理是隊列,先進先出特性就保證數據的順序性。

總結一句話:管道是批處理命令變種優化措施,類似Redis的原生批命令(mget和mset)。


(三)、實操


(四)、管道功能小總結

1、pipeline與原生批命令對比

  • 原生批量命令是原子性(例如:mset,?mget),pipeline是非原子性
  • 原生批量命令一次只能執行一種命令,pipeline支持批量執行不同命令
  • 原生批命令是服務端實現,而pipeline需要服務端與客戶端共同完成。

2、pipeline與事務對比

  • 事務具有原子性,管道不具有原子性
  • 管道一次性將多條命令發送到服務器,事務是一條一條的發,事務只有在接收到exec命令后才會執行,管道不會。
  • 執行事務時會阻塞其他命令的執行,而執行管道中的命令時不會阻塞其他命令

3、pipeline注意事項

  • pipeline緩沖的指令只是會依次執行,不保證原子性,如果執行中指令發生異常,將會繼續執行后續的指令。
  • 使用pipeline組裝的命令個數不能太多,不然數據量過大客戶端阻塞的時間可能過久,同時服務端此時也被迫回復一個隊列答復,占用很多內存。

三、Redis發布訂閱(了解即可

(一)、定義

Redis發布訂閱是一種消息通信模式。客戶端可以訂閱一個或多個頻道,當有其他客戶端向這些頻道發布消息時,訂閱者會收到相應的消息。這是一種基于事件驅動的通信方式,適用于實時消息推送、實時通知等場景。


(二)、實操

開啟三個客戶端,A、B訂閱C,C發布消息,A、B能及時獲取消息。


(三)、發布訂閱功能小總結

Redis可以實現消息中間件MQ的功能,通過發布訂閱實現消息的引導和分流。但不推薦使用該功能,專業的事情交給專業的中間件處理,redis就做好分布式緩存功能。

Pub/Sub的缺點:

  • 發布的消息在Redis系統中不能持久化,因此,必須先執行訂閱,再等待消息發布。如果先發布了消息,那么該消息由于沒有訂閱者,消息將被直接丟棄。
  • 消息只管發送對于發布者而言消息是即發即失的,不管接收,也沒有ACK機制,無法保證消息的消費成功。
  • 以上的缺點導致Redis的Pub/Sub模式就像個小玩具,在生產環境中幾乎無用武之地,為此Redis5.0版本新增了Stream數據結構,不但支持多播,還支持數據持久化,相比Pub/Sub更加的強大。但是仍然不推薦使用Stream來做MQ的功能,還是那句話,專業的事情交給專業的中間件處理。

四、總結

Redis 的事務、管道以及發布訂閱功能,賦予了開發者強大的數據處理與通信能力。事務機制保證了數據操作具備一致性和完整性,管道技術提升了客戶端與服務器之間的通信效率,發布訂閱機制則實現了實時消息推送功能。在實際項目開發過程中,可依據具體業務需求,靈活運用上述功能,充分發揮 Redis 的技術優勢,從而有效提升系統性能與用戶體驗。


ps:努力到底,讓持續學習成為貫穿一生的堅守。學習筆記持續更新中。。。。

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

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

相關文章

Sprinig源碼解析

前言 Spring 框架是 Java 企業級開發的基石,其源碼設計體現了模塊化、擴展性和靈活性。以下從 IoC 容器、AOP 實現、核心模塊和關鍵設計模式四個角度對 Spring 源碼進行深度解析,幫助理解其底層機制。即使Spring會使用的人見得就能使用。 一、IoC 容器源…

如何簡單的去使用jconsloe 查看線程 (多線程編程篇1)

目錄 前言 1.進程和線程 進程 PCB 的作用 并發編程和并行編程 線程 為什么選擇多線程編程 2.在IDEA中如何簡單創建一個線程 1. 通過繼承Thread類 2. 通過實現 Runnable 接口 3. 使用 Lambda 表達式 3.如何簡單使用jconsloe去查看創建好的線程 前言 2025來了,這是第…

【ISO 14229-1:2023 UDS診斷(ECU復位0x11服務)測試用例CAPL代碼全解析④】

ISO 14229-1:2023 UDS診斷【ECU復位0x11服務】_TestCase04 作者:車端域控測試工程師 更新日期:2025年02月17日 關鍵詞:UDS診斷協議、ECU復位服務、0x11服務、ISO 14229-1:2023 TC11-004測試用例 用例ID測試場景驗證要點參考條款預期結果TC…

3.10 實戰Hugging Face Transformers:從文本分類到模型部署全流程

實戰Hugging Face Transformers:從文本分類到模型部署全流程 一、文本分類實戰:IMDB電影評論情感分析 1.1 數據準備與預處理 from datasets import load_dataset from transformers import AutoTokenizer # 加載IMDB數據集 dataset = load_dataset("imdb") …

【人工智能】釋放數據潛能:使用Featuretools進行自動化特征工程

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 特征工程是機器學習流程中至關重要的一步,它直接影響模型的性能。然而,手動特征工程既耗時又需要領域專業知識。Featuretools是一個強大的…

MybaitsPlus學習筆記(二)基本CURD

目錄 一、BaseMapper 二、常用實例 1、插入 2、刪除 3、修改 4、查詢 三、IService 四、 IService中的一些方法測試 一、BaseMapper MyBatis-Plus中的基本CRUD在內置的BaseMapper中都已得到了實現,我們可以直接使用,接口如 下: publ…

設計模式之適配模式是什么?以及在Spring AOP中的攔截器鏈的使用源碼解析。

前言 本文涉及到適配模式的基本用法,以及在Spring AOP中如何使用,首先需要了解適配模式的工作原理,然后結合Spring AOP的具體實現來詳細詳細解析源碼。 首先,適配模式,也就是Adapter Pattern,屬于結構型設計…

【C++】36.C++IO流

文章目錄 1. C語言的輸入與輸出2. 流是什么3. CIO流3.1 C標準IO流3.2 C文件IO流 4. stringstream的簡單介紹 1. C語言的輸入與輸出 C語言中我們用到的最頻繁的輸入輸出方式就是scanf ()與printf()。 scanf(): 從標準輸入設備(鍵盤)讀取數據,并將值存放在變量中。pri…

JavaScript表單介紹

一、表單的基本概念 在網頁開發里&#xff0c;表單是實現用戶與網頁交互的關鍵組件&#xff0c;用于收集用戶輸入的數據&#xff0c;JavaScript 則能為表單增添強大的交互性和功能性。表單在 HTML 里通過 <form> 標簽創建&#xff0c;包含多種表單元素&#xff0c;如文本…

哈希表(C語言版)

文章目錄 哈希表原理實現(無自動擴容功能)代碼運行結果 分析應用 哈希表 如何統計一段文本中&#xff0c;小寫字母出現的次數? 顯然&#xff0c;我們可以用數組 int table[26] 來存儲每個小寫字母出現的次數&#xff0c;而且這樣處理&#xff0c;效率奇高。假如我們想知道字…

昆蟲-目標檢測數據集(包括VOC格式、YOLO格式)

昆蟲-目標檢測數據集&#xff08;包括VOC格式、YOLO格式&#xff09; 數據集&#xff1a; 鏈接: https://pan.baidu.com/s/1tYb8s-AVJgSp7SGvqdWF9A?pwdt76a 提取碼: t76a 數據集信息介紹&#xff1a; 共有 6009 張圖像和一一對應的標注文件 標注文件格式提供了兩種&#x…

C++(23):unreachable

C++23在頭文件 "><utility>定義了std::unreachable(),用于指示編譯器,該段代碼不應該被允許,因此編譯器可以對該位置進行優化,如果一旦允許了該位置的代碼,行為未定義: #include <utility> #include <iostream>using namespace std;int func(…

備戰藍橋杯 Day1 回顧語言基礎

開啟藍橋杯刷題之路 Day1 回顧語言基礎 1.配置dev 工具->編譯選項->勾選編譯時加入以下命令->設定編譯器配置(release和debug)都要-> -stdc11 ->代碼生成/優化->代碼生成/優化->語言標準(-std)->ISO C11 ->代碼警告->顯示最多警告信息(-Wall)…

python學opencv|讀取圖像(七十五)人臉識別:Fisherfaces算法和LBPH算法

【1】引言 前序學習進程中&#xff0c;已經掌握了使用Eigenfaces算法進行的人臉識別。相關文章鏈接為&#xff1a; python學opencv|讀取圖像&#xff08;七十四&#xff09;人臉識別&#xff1a;EigenFaces算法-CSDN博客 在此基礎上&#xff0c;學習剩余兩種人臉識別算法&am…

React 前端框架介紹

什么是 React&#xff1f; React 是一個由 Facebook 開發并維護的開源 JavaScript 庫&#xff0c;用于構建用戶界面。它主要用于創建交互式用戶界Face&#xff08;UI&#xff09;&#xff0c;尤其是當數據變化時需要更新部分視圖時非常有效。React 的核心思想是組件化和聲明性…

包裝類的空指針異常

問題&#xff1a; Integer是引用對象&#xff0c;當初始化不進行賦值的時候是null,是null就不可以自動拆箱 實踐&#xff1a; public class Test {public static void main(String[] args) {Integer num null;//自動拆箱int i num;} } 會包異常信息&#xff1a; Excepti…

【Elasticsearch】檢索選定字段(Retrieve selected fields)

在 Elasticsearch 中&#xff0c;檢索選定字段&#xff08;Retrieve selected fields&#xff09;是一個重要的功能&#xff0c;用于優化查詢性能和減少數據傳輸量。以下是結合所有回答的詳細總結&#xff0c;涵蓋每種字段檢索方式的原理、應用場景、性能特點以及限制。 1._so…

【MySQL】 基本查詢(下)

歡迎拜訪&#xff1a;霧里看山-CSDN博客 本篇主題&#xff1a;【MySQL】 基本查詢(下) 發布時間&#xff1a;2025.2.18 隸屬專欄&#xff1a;MySQL 目錄 Update語法案例 Delete刪除數據語法案例 截斷表語法案例 插入查詢結果語法案例 聚合函數函數介紹案例 group by子句的使用語…

docker 基礎命令使用(ubuntu)

docker 狀態查詢 docker ps docker ps -adocker --version docker info docker --help docker run --help docker ps --help ...docker 操作鏡像命令 docker imagesdocker rmi 鏡像id/鏡像名docker 操作容器命令 docker ps docker ps -adocker run 命令 # 端口映射 -p 參數…

idea 2023.3.7常用插件

idea 2023.3.7常用插件 文檔 idea 2019.3常用插件idea 2023.3.7常用插件 idea 2023.3.7常用插件 插件名稱插件版本說明1AceJump3.5.9AceJump允許您快速將插入符號導航到編輯器中可見的任何位置。只需按“ctrl&#xff1b;”&#xff0c;鍵入一個字符&#xff0c;然后在Ace …