淺談 Redis 數據類型

淺談 Redis 數據類型

(一)String 類型

Redis 的 String 類型 是二進制安全的,可以用來存儲 文本字符串、int 類型數據和 bitmap 位圖 等數據。

1. 字符串操作

  • 適用于存儲 文本、JSON、序列化數據 等任意二進制安全的內容

    命令作用示例
    SET設置鍵值SET name "Alice"
    GET獲取值GET name"Alice"
    APPEND追加內容APPEND name " Smith""Alice Smith"
    STRLEN獲取字節長度STRLEN name11
    GETRANGE截取子串GETRANGE name 0 4"Alice"
    SETRANGE覆蓋部分內容SETRANGE name 6 "Taylor""Alice Taylor"
    MSET/MGET批量操作MSET k1 "v1" k2 "v2"
  • 二進制安全:可存儲圖片、序列化對象等任意數據

  • 自動編碼:短字符串用 embstr 編碼(內存連續),長字符串用 raw 編碼

SETNX 操作實現分布式鎖

SETNX key value
  • key 不存在 時,設置其值為 value,并返回 OK(成功);若 key 已存在,則不做任何操作,返回 nil(失敗)

  • 為防止鎖持有者崩潰后鎖無法釋放,需設置超時(通過 EXPIRE

  • 任務完成后,主動刪除鍵以釋放鎖(通過 DEL

  • **【風險1】**若 SETNX 成功,但 EXPIRE 未執行(如客戶端崩潰),鎖會永久占用

    【解決方案】使用 ??SET 命令的 NXEX 選項?? 原子性加鎖和設置過期時間

    SET key value NX EX 10      # 原子操作:僅當不存在時設置,并過期時間為 10 秒
    
  • **【風險2】**任務未在過期時間內完成,鎖被提前釋放

    **【解決方案】**看門狗機制:啟動后臺線程定期續期

    EVAL "if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('EXPIRE', KEYS[1], ARGV[2]) else return 0 end" 1 key value 10         # 每 10 秒執行一次該 LUA 腳本以續期 
    

2. 數值操作

  • 當 String 的值是 整數或浮點數 時,Redis 提供專用命令進行原子增減
命令作用示例
INCR原子 +1INCR counter1
INCRBY原子 +NINCRBY counter 56
DECR原子 -1DECR counter5
DECRBY原子 -NDECRBY counter 32
INCRBYFLOAT原子 +浮點數INCRBYFLOAT price 1.5"3.5"
  • 編碼優化:數值用 int 編碼(固定 8 字節),浮點數用 raw
  • 原子性:無需事務即可避免并發沖突。

3. bitmap 位圖操作

  • Bitmap 是 String 的擴展,通過 位(bit)操作 實現布爾統計,可用于布隆過濾器、用戶狀態統計等場景
命令作用示例
SETBIT設置某位為 0/1SETBIT login:2023 100 1(用戶 100 登錄)
GETBIT獲取某位的值GETBIT login:2023 1001
BITCOUNT統計 1 的數量BITCOUNT login:202350(50 人登錄)
BITOP位運算(AND/OR/XOR)BITOP AND result login:day1 login:day2
BITPOS查找第一個 0/1 位BITPOS login:2023 1100
  • 內存高效:1 億用戶登錄狀態僅需約 12MB
  • 高性能:位運算復雜度 O(n),適合批量處理

4. 二進制安全與 Encoding 加速機制

  • Redis 的 String 類型基于簡單動態字符串實現,數據按字節數組存儲,不預設編碼格式,讀寫時不會做任何轉換
  • Redis 為 String 類型設計了多種編碼格式(encoding),根據數據內容動態選擇最優編碼以節省內存和提高性能。通過 OBJECT ENCODING key 可查看編碼類型
編碼類型適用場景優化原理
int存儲 64 位有符號整數(如 123直接使用整數存儲,避免字符串轉換。
embstr短字符串(≤44 字節,Redis 7+)內存連續分配,減少碎片,CPU 緩存友好。
raw長字符串(>44 字節)或二進制數據標準 SDS 動態分配,支持大容量數據。

(二) List 類型

Redis 的 List 類型 是一個雙向鏈表數據結構,支持在頭部和尾部高效插入、刪除元素,因此可以靈活實現 棧(Stack)、隊列(Queue)、數組(Array)阻塞隊列(Blocking Queue) 的語義。

  • LPUSH + LPOP
  • 隊列RPUSH + LPOP
  • 數組LINDEX + LSET
  • 阻塞隊列RPUSH + BRPOP

以下是詳細用法解析:

1. List 作為棧(Stack)

特點:后進先出(LIFO),通過 LPUSH + LPOP 實現
??適用場景??:函數調用棧、撤銷操作(Undo)記錄
??操作命令??:

# 入棧(左側插入)
LPUSH stack "task1"
LPUSH stack "task2"  # 棧內順序: ["task2", "task1"]# 出棧(左側彈出)
LPOP stack  # 返回 "task2",棧剩余: ["task1"]# 查看棧頂元素(不彈出)
LINDEX stack 0  # 返回 "task1"

2. List 作為隊列(Queue)

特點:先進先出(FIFO),通過 RPUSH + LPOP 實現
??適用場景??:任務隊列、消息緩沖
??操作命令??:

# 入隊(尾部插入)
RPUSH queue "msg1"
RPUSH queue "msg2"  # 隊列順序: ["msg1", "msg2"]# 出隊(頭部彈出)
LPOP queue  # 返回 "msg1",隊列剩余: ["msg2"]# 查看隊列長度
LLEN queue  # 返回 1

3. List 作為數組(Array)

特點:支持按索引訪問和修改,通過 LINDEX + LSET 實現
??適用場景??:隨機訪問列表元素、動態數組
??操作命令??:

# 初始化數組
RPUSH array "a" "b" "c"  # 數組: ["a", "b", "c"]# 按索引讀取(索引從0開始)
LINDEX array 1  # 返回 "b"# 按索引修改
LSET array 1 "B"  # 數組變為: ["a", "B", "c"]# 獲取全部元素
LRANGE array 0 -1  # 返回 ["a", "B", "c"]

4. List 作為阻塞隊列(Blocking Queue)

特點:消費者阻塞等待新元素,通過 BRPOP/BLPOP 實現
??適用場景??:實時消息系統、任務調度(避免輪詢)
??操作命令??:

# 生產者入隊(尾部插入)
RPUSH bqueue "job1" "job2"# 消費者阻塞出隊(從頭部獲取,超時時間5秒)
BRPOP bqueue 5  
# 1) 如果隊列不為空,立即返回元素(如 "job1")
# 2) 如果隊列為空,阻塞 5 秒后返回nil(若期間有新元素插入則立即返回)

(三)Hash 類型

Redis 的 Hash 類型 是一個 鍵值對集合,適合存儲對象。它比 String 類型更節省內存,且支持 字段級操作(單獨讀寫某個字段而無需序列化整個對象)。

1. Hash 的底層結構

  • ziplist(壓縮列表):當字段數和字段值較小時使用,內存連續,節省空間
  • hashtable(哈希表):字段較多或值較大時自動轉換,查詢效率 O(1)

2. 核心操作命令

(1)設置與獲取字段值

命令作用示例
HSET設置字段值HSET user:1 name "Alice" age 30
HGET獲取字段值HGET user:1 name"Alice"
HMSET批量設置字段HMSET user:1 name "Alice" age 30
HMGET批量獲取字段HMGET user:1 name age["Alice", "30"]
HGETALL獲取所有字段和值HGETALL user:1["name", "Alice", "age", "30"]
  • 示例
HSET product:1001 name "iPhone" price 999 stock 50
HGET product:1001 price  # 返回 "999"
HGETALL product:1001     # 返回所有字段和值

(2)字段增減與刪除

命令作用示例
HINCRBY字段值整數增減HINCRBY user:1 age 1
HINCRBYFLOAT字段值浮點數增減HINCRBYFLOAT account:1 balance 50.5
HDEL刪除字段HDEL user:1 age
HEXISTS判斷字段是否存在HEXISTS user:1 name1(存在)
  • 示例
HINCRBY product:1001 stock -1  # 庫存減1
HDEL product:1001 price        # 刪除價格字段

(3)查詢與統計

命令作用示例
HKEYS獲取所有字段名HKEYS user:1["name", "age"]
HVALS獲取所有字段值HVALS user:1["Alice", "30"]
HLEN獲取字段數量HLEN user:12
HSTRLEN獲取字段值的字節長度HSTRLEN user:1 name5("Alice"占 5 字節)
  • 示例
HKEYS product:1001   # 返回 ["name", "price", "stock"]
HLEN product:1001    # 返回 3

(4)原子操作

命令作用示例
HSETNX字段不存在時才設置HSETNX user:1 email "alice@example.com"
HSCAN增量迭代字段(大數據量時避免阻塞)HSCAN user:1 0
  • 示例
HSETNX user:1 email "alice@example.com"  # 僅當 email 不存在時設置

3. 對象的三種存儲策略:單 key 存儲、多 key 存儲、使用 hash 類型

(1)序列化為字符串(單 Key 存儲)

SET user:1000 '{"name":"Alice","age":30,"email":"alice@example.com"}'

(2)每個字段單獨存儲(多 Key 存儲)

SET user:1000:name "Alice"
SET user:1000:age 30
SET user:1000:email "alice@example.com"

(3)使用 Hash 類型

HSET user:1000 name "Alice" age 30 email "alice@example.com"

(4)三種策略比較

維度序列化為字符串多 Key 存儲Hash 類型
讀寫效率整體讀寫快,部分更新慢部分讀寫快,整體查詢慢部分和批量讀寫均快
內存占用低(單個 Key)高(每個 Key 有元數據)中(小 Hash 用 zip list)
原子性高(整個對象原子操作)低(需事務)中(單字段操作原子)
字段級 TTL不支持支持不支持
適用字段規模任意少量字段中小規模字段
復雜結構支持支持(JSON 等序列化方式)需額外設計需序列化字段值

(四)Set 類型

Redis 的 Set 類型 是一個 無序、去重的集合,底層基于哈希表實現,支持插入、刪除元素以及多個集合的交并差集運算,同時提供了隨機返回指定個數元素的功能。

1. Set 的核心特性

  • 無序性:元素沒有固定順序,遍歷時順序不確定
  • 唯一性:自動去重,重復插入的元素會被忽略

2. 常用命令

(1)基本操作

命令作用示例
SADD添加元素(自動去重)SADD tags "redis" "db"
SREM刪除元素SREM tags "db"
SMEMBERS獲取所有元素SMEMBERS tags
SISMEMBER判斷元素是否存在SISMEMBER tags "redis"1(存在)
SCARD獲取集合元素數量SCARD tags2
SRANDMEMBER隨機返回元素(可指定數量)SRANDMEMBER tags 2
  • 示例
SADD users:1000:followers "user1" "user2" "user3"
SMEMBERS users:1000:followers  # 返回 ["user1", "user2", "user3"]
SISMEMBER users:1000:followers "user1"  # 返回 1(存在)

(2)集合運算

命令作用示例
SINTER返回多個集合的交集SINTER set1 set2
SUNION返回多個集合的并集SUNION set1 set2
SDIFF返回第一個集合與其他集合的差集SDIFF set1 set2
SINTERSTORE存儲交集到新集合SINTERSTORE result set1 set2
SUNIONSTORE存儲并集到新集合SUNIONSTORE result set1 set2
SDIFFSTORE存儲差集到新集合SDIFFSTORE result set1 set2
  • 示例
SADD group1 "user1" "user2" "user3"
SADD group2 "user2" "user3" "user4"
SINTER group1 group2  # 返回 ["user2", "user3"](共同成員)
SDIFF group1 group2   # 返回 ["user1"](僅在 group1 中的成員)

(3)隨機返回元素

  • Redis 的 Set 類型提供了 隨機返回元素 的功能,適用于 抽獎、隨機推薦、隨機選取樣本 等場景
SRANDMEMBER key count
  • key:Set 的鍵名
  • count:指定返回的元素數量
    • count > 0:返回 不重復 的元素(最多返回整個 Set 的大小)
    • count < 0:返回元素可能 重復(適用于允許重復抽獎的場景)

(五)Sorted Set 類型

Redis 中的 Sorted Set 類型 也是一種集合類型,集合中的元素可以按照自定義分值排序,底層基于跳表實現。

1. 特點

  • 唯一性:成員(member)不可重復,但分數(score)可重復
  • 有序性:按 score 排序(默認升序),相同 score 按字典序排序

2. 核心命令

  • 成員操作命令

    命令功能
    ZADD key score member添加/更新成員(支持NX/XX/INCR選項)
    ZREM key member刪除指定成員
    ZINCRBY key increment member增加成員分數
    ZSCORE key member獲取成員分數
  • 查詢命令

    命令功能
    ZRANGE key start stop按分數升序返回成員(WITHSCORES顯示分數)
    ZREVRANGE key start stop按分數降序返回成員
    ZRANGEBYSCORE key min max返回分數在 [min,max] 區間的成員
  • 排名統計命令

    命令功能
    ZRANK key member獲取成員升序排名(從 0 開始)
    ZREVRANK key member獲取成員降序排名
    ZCARD key返回成員總數
    ZCOUNT key min max統計分數范圍內的成員數
  • 集合運算命令

    計算多個有序集合的并集存儲(交集存儲)

    ZUNIONSTORE/ZINTERSTORE destkey numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

    • 必選參數

      • destkey:存儲結果的鍵名
      • numkeys:參與計算的集合數量(后續需對應數量的 key
      • key:參與計算的集合鍵名(至少一個)
    • 可選參數

      • WEIGHTS:為每個集合的分值設置權重(默認權重為 1
      • AGGREGATE:合并重復成員的分值策略(SUM 求和、MIN 取最小、MAX 取最大,默認 SUM
    • 示例

    ZADD scores1 10 "Alice" 20 "Bob"
    ZADD scores2 5 "Alice" 30 "Charlie"
    ZUNIONSTORE result 2 scores1 scores2 WEIGHTS 2 3 SUM
    
    • Alice 的分值: 10 * 2 + 5 * 3 = 35

    • Bob 的分值 = 20 * 2 = 40

    • Charlie 的分值 = 30 * 3 = 90

    1) "Alice"   35
    2) "Bob"     40
    3) "Charlie" 90
    

3. 底層實現

Sorted Set 是 Redis 中最復雜的數據結構之一。它通過 跳表和哈希表 的混合實現,兼顧了高效查詢和動態排序的能力。

編碼方式數據結構觸發條件特點
ziplist壓縮列表 [member1, score1, member2, score2, ...]元素數量 ≤ zset-max-ziplist-entries(默認128)且所有元素長度 ≤ zset-max-ziplist-value(默認64字節)內存緊湊,但增刪效率低(O(n))
skiplist + dict跳表 + 哈希表不滿足 ziplist 條件時自動轉換支持高效查詢和范圍操作(O(log n))
  • 哈希表與跳表的協同

    跳表保證有序性,哈希表加速單成員查詢,兩者互補

  • 內存與 CPU 的權衡

    小數據用 ziplist 節省內存,大數據用 skiplist 提升操作效率

(1)跳表的結構

  • 跳表(Skip List)是一種基于 多層有序鏈表 的數據結構,通過 概率平衡 實現高效的動態操作(平均 O(log n) 時間復雜度)

  • 跳表由多層鏈表組成,每層鏈表都是有序的,但高層鏈表是低層鏈表的【快速通道】:

    • 最底層鏈表:包含所有元素的有序鏈表

    • 高層鏈表:每層節點數約為下一層的一半,形成跳躍路徑

(2)查找原理:平均 O(log n)(最壞 O(n)

  • 從最高層頭節點開始,向右遍歷:

    • 若當前節點的下一個節點值 ≤ 目標值,則繼續向右

    • 若下一個節點值 > 目標值,則向下移動到下一層

  • 重復上述過程,直到最底層,找到目標節點或確認不存在

(3)插入原理:平均 O(log n)

  • 查找插入位置,記錄每一層的前驅節點,即插入位置左側的節點
  • 隨機生成層高,每個新插入節點的層數由 概率決定,通常采用 “拋硬幣”策略
    1. 初始層高:新節點至少在第 0 層(最底層,包含所有節點)
    2. 逐層晉升:每次“拋硬幣” 若為“正面”(概率通常為 50%)則層數 +1;否則停止
    3. Redis 優化:降低晉升概率(p=0.25)和限制最大層數(32),平衡性能與內存開銷
  • 在每一層(從生成的最高層到最底層)鏈表中插入新節點,并更新前后節點的指針

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

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

相關文章

Day1 時間復雜度

一 概念 在 C 中&#xff0c;時間復雜度是衡量算法運行時間隨輸入規模增長的趨勢的關鍵指標&#xff0c;用于評估算法的效率。它通過 大 O 表示法&#xff08;Big O Notation&#xff09; 描述&#xff0c;關注的是輸入規模 n 趨近于無窮大時&#xff0c;算法時間增長的主導因…

PAC文件:智能代理配置的瑞士軍刀

在日常上網和企業網絡環境中&#xff0c;我們經常需要配置代理服務器來訪問特定資源、增強安全性或管理網絡流量。Windows和macOS系統自帶的代理配置通常提供全局代理或簡單的排除列表&#xff0c;這在某些復雜場景下顯得不夠靈活。例如&#xff0c;我們可能只想代理某個特定的…

獲取高德地圖JS API的安全密鑰和Key的方法

要使用高德地圖JavaScript API&#xff0c;您需要獲取API Key和安全密鑰(securityJsCode)。以下是獲取步驟&#xff1a; 1. 注冊高德開放平臺賬號 首先訪問高德開放平臺&#xff0c;如果沒有賬號需要先注冊。 2. 創建應用獲取Key 登錄后進入"控制臺" 點擊"應…

攜程酒店 phantom-token token1004 分析

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 部分python代碼 搞APP搞的心態有點崩…

小紅書多賬號運營效率優化:技術方案與自動化實踐

目錄 一、效率瓶頸與流程優化方向 二、技術實現方案與效率提升路徑 1. 多賬號統一管理&#xff1a;環境隔離與批量操作 2. 自動化任務設計&#xff1a;RPA與腳本化執行 四、效果驗證與數據對比 五、總結與開源工具推薦 六、下載地址&#xff1a; 一、效率瓶頸與流程優化…

FastDDS Transport功能模塊初步整理

一. 總體結構 二. 主要類的功能 2.1 TransportDescriptor和TransportInterface ? FastDDS中整個Transport類的設計遵循的是設計模式中的建造者模式&#xff0c;其中&#xff0c;TransportDescriptor就是建造者&#xff0c;而TransportInterface則是建造出來的產品。 ? Tra…

zabbix最新版本7.2超級詳細安裝部署(一)

如果文章對你有用&#xff0c;請留下痕跡在配置過程中有問題請及時留言&#xff0c;本作者可以及時更新文章 目錄 1、提前準備環境 2、zabbix7.2安裝部署 3、安裝并配置數據庫 4、為Zabbix server配置數據庫 5、為Zabbix前端配置PHP 6、啟動Zabbix server和agent進程 7、關閉防…

CodeBlocks調試報錯

嘗試打斷點&#xff0c;并且點擊紅色箭頭啟動debugger時&#xff0c;控制臺報錯 Active debugger config: GDB/CDB debugger:Default Building to ensure sources are up-to-date Selecting target: Debug Adding source dir: C:\Users\Lenovo\Desktop\exercise\ Adding source…

Manus 開放注冊:AI 智能體領域的新起點

2025 年 5 月 13 日成為了一個具有特殊意義的日子 —— 備受矚目的 AI 智能體平臺 Manus&#xff08;Manus&#xff09;正式宣布開放注冊。這一消息猶如一顆重磅炸彈&#xff0c;瞬間在全球科技圈引起了廣泛關注和熱烈討論。在此之前&#xff0c;Manus 一直以其獨特的魅力和極高…

車載網關作為車輛網絡系統的核心樞紐

我是穿拖鞋的漢子&#xff0c;魔都中堅持長期主義的汽車電子工程師。 老規矩&#xff0c;分享一段喜歡的文字&#xff0c;避免自己成為高知識低文化的工程師&#xff1a; 鈍感力的“鈍”&#xff0c;不是木訥、遲鈍&#xff0c;而是直面困境的韌勁和耐力&#xff0c;是面對外界…

俄羅斯方塊算法2025.5.10

問題描述 俄羅斯方塊&#xff08;Tetris&#xff09;作為風靡全球38年的現象級益智游戲&#xff0c;其簡單易學但難于精通的特性使其成為游戲史上的不朽經典。以下是其核心游戲規則解析及我們的要求&#xff1a; 游戲界面由20行10列的可視區域組成&#xff0c;7種不同形狀的四…

Femap許可網絡配置

電磁仿真領域&#xff0c;Femap以其卓越的性能和廣泛的應用場景&#xff0c;成為眾多工程師和科研人員的首選工具。為了滿足多用戶協作的需求&#xff0c;Femap提供了靈活的網絡配置方案。本文將詳細介紹Femap許可網絡配置的方法和優勢&#xff0c;幫助您輕松實現多用戶高效協作…

計算機視覺----時域頻域在圖像中的意義、傅里葉變換在圖像中的應用、卷積核的頻域解釋

1、時域&#xff08;時間域&#xff09;——自變量是時間,即橫軸是時間,縱軸是信號的變化。其動態信號x&#xff08;t&#xff09;是描述信號在不同時刻取值的函數。 2、頻域&#xff08;頻率域&#xff09;——自變量是頻率,即橫軸是頻率,縱軸是該頻率信號的幅度,也就是通常說…

主流高防服務器技術對比與AI防御方案實戰

1. 高防服務器核心能力對比 當前市場主流高防服務商&#xff08;如阿里云、騰訊云、華為云&#xff09;的核心防御能力集中在流量清洗與靜態規則防護&#xff0c;但面臨以下挑戰&#xff1a; 靜態防御瓶頸&#xff1a;傳統方案依賴預定義規則&#xff0c;對新型攻擊&#xff…

常時間運行的程序 導致系統卡頓 自動監控系統CPU和內存利用率 自動選擇 內存回收 軟件重啟 電腦重啟

長時間運行安防系統&#xff0c;導致CPU或內存利用率超80%&#xff0c;使得電腦變的緩慢、卡頓的問題。定時獲取CPU和內存利用率的數據&#xff0c;在不同時間段&#xff08;如凌晨與平時&#xff09;&#xff0c;根據利用率的不同的閾值&#xff0c;進行&#xff1a;內存回收(…

OpenCV播放攝像頭視頻

OpenCV計算機視覺開發實踐&#xff1a;基于Qt C - 商品搜索 - 京東 播放攝像頭視頻和播放視頻文件類似&#xff0c;也是通過類VideoCapture來實現&#xff0c;只不過調用open的時候傳入的是攝像頭的索引號。如果計算機安裝了一個攝像頭&#xff0c;則open的第一個參數通常是0&…

操作系統:內存管理

目錄 1、主要目標 2、核心概念和技術 2.1 物理內存與虛擬內存 2.2 內存分頁機制 2.3 頁面置換算法 3、監控與性能優化 3.1 查看物理內存 3.2 查看虛擬內存 3.3 性能問題 1> 內存不足&#xff08;OOM&#xff09; 2> 內存泄漏 3> 內存碎片 3.4 性能優化策…

專題四:綜合練習( 找出所有子集的異或總和再求和)

以leetcode1863題為例 題目分析&#xff1a; 找到每個子集&#xff0c;然后子集中的元素異或之后全部相加 算法原理分析&#xff1a; 畫決策樹&#xff1a;第一層為這個子集有一個元素 第二層這個子集有兩個元素 從上往下羅列&#xff0c;把所有子集都羅列出來&#xf…

【python】—conda新建python3.11的環境報錯

1.報錯 conda create -n py3.11 python3.11 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ Collecting package metadata: done Solving environment: failed PackagesNotFoundError: The following packages are not available from current channel…

RabbitMQ事務機制

在RabbitMQ中&#xff0c;生產者為了確保消息發送成功&#xff0c;一種是使用 confirm 確認機制&#xff0c;另一種就是使用事務機制&#xff0c;事務機制就是允許生產者在發送消息時&#xff0c;將多個消息操作作為一個原子單元進行處理&#xff0c;要么所有操作都成功執行&am…