Redis 的指令執行方式:Pipeline、事務與 Lua 腳本的對比

Pipeline

客戶端將多條命令打包發送,服務器順序執行并一次性返回所有結果。可以減少網絡往返延遲(RTT)以提升吞吐量。

需要注意的是,Pipeline 中的命令按順序執行,但中間可能被其他客戶端的命令打斷

典型場景:批量插入、查詢或更新數據,也就是命令間沒有什么依賴關系的情況。

比如下面這個例子,Pipeline 將 3 個 SET 打包發送,減少三次網絡往返為一次。假設單次命令 RTT 為 1ms,3 次命令需 3ms;使用 Pipeline 僅需約 1ms。

SET key1 value1
SET key2 value2
SET key3 value3

事務

可以確保一組命令“原子”執行,確保一組命令執行過程中不被其他客戶端打斷如果事務中有命令失敗,整個事務不會回滾,但后續命令不會執行

通常,它會結合 WATCH 來實現樂觀鎖

另外,Redis 中的原子性和 MySQL 中的原子性意義不同。MySQL 的原子性意味著,要么全部執行成功,要么就不執行,它會涉及回滾的操作。但 Redis 沒有沒有回滾的操作(為了性能,實現回滾需要維護事務日志等其他一些機制,會增加開銷),它的原子性指,一組命令順序執行,不會被其他命令打斷。

還有,Redis 的事務并不會像 Pipeline 一樣,將命令一起發送給 Redis,而是會一條一條發送。為什么?可以結合下面的過程,這樣的話可以用來進行語法檢查。

客戶端發送 MULTI,開啟事務。
客戶端逐條發送命令(如 SET、INCR),每條命令立即傳輸到服務器。
服務器收到命令后,不執行,而是將其放入事務隊列,并返回 QUEUED 響應。
客戶端發送 EXEC,服務器原子性執行隊列中的所有命令,并返回結果。
或者,客戶端發送 DISCARD,清空隊列,取消事務。

在實際使用中,比如在 Python 中的 redis-py 庫,事務會以 Pipeline 的方式批量發送,來優化命令發送。

pipe = r.pipeline()  # 創建 Pipeline
pipe.multi()  # 開始事務
pipe.set('key1', 'value1')
pipe.set('key2', 'value2')
pipe.execute()  # 發送并執行事務

典型場景:需要保證數據一致性的操作,如轉賬、庫存扣減。

WATCH accountA  -- 監控賬戶 A 的鍵,防止被其他客戶端修改
MULTI
GET accountA -- 如果賬戶 A 的值發生改變,剩下的命令將不會執行
SET accountA $new_balanceA -- 更新賬戶 A 余額(減 100)
SET accountB $new_balanceB -- 更新賬戶 B 余額(加 100)
EXEC

Lua 腳本

Lua 腳本可以在一條命令中實現復雜邏輯,如條件判斷、循環、錯誤控制。它和事務功能上有些相似,都是為了實現原子性。不過 Lua 腳本有兩種選擇,redis.call() 失敗時腳本停止(前面已經執行完的命令不會受影響);redis.pcall() 捕獲錯誤繼續執行。

它比起事務有什么好處呢?

  • 比如事務中需要依賴于一個 GET 操作的結果,來決定后面的操作,事務無法實現,需要結合客戶端的代碼,加大了復雜性
  • 事務中的每條命令都會與 Redis 服務器進行網絡交互,增加了客戶端與服務器的交互

另外,為了避免每次都需要傳輸完整的 Lua 腳本給 Redis,Redis 還設立了一個緩沖區,來去存放 Lua 腳本的內容以及它的 SHA1 值(一種哈希算法,將 Lua 腳本內容映射為固定長度的唯一標識符)。之后只需傳輸對應的 SHA1 值即可執行對應的腳本。

總之,Lua 腳本會更靈活,事務能做的,Lua 都能做。所以能用 Lua 就用 Lua

典型場景:需要保證數據一致性的操作,如轉賬、庫存扣減。和事務差不多。

local accountA = KEYS[1]    -- 賬戶 A 的鍵
local accountB = KEYS[2]    -- 賬戶 B 的鍵
local amount = tonumber(ARGV[1])  -- 轉賬金額(轉換為數字)-- 獲取賬戶 A 余額(不存在則默認為 0)
local balanceA = redis.call('GET', accountA) or 0
balanceA = tonumber(balanceA)-- 檢查余額是否足夠
if balanceA < amount thenreturn 0  -- 余額不足,返回 0
end-- 獲取賬戶 B 余額(不存在則默認為 0)
local balanceB = redis.call('GET', accountB) or 0
balanceB = tonumber(balanceB)-- 執行轉賬
redis.call('SET', accountA, balanceA - amount)  -- 扣減賬戶 A
redis.call('SET', accountB, balanceB + amount)  -- 增加賬戶 Breturn 1  -- 轉賬成功,返回 1-- Redis 調用方式:
EVAL "local accountA = KEYS[1] local accountB = KEYS[2] local amount = tonumber(ARGV[1]) local balanceA = redis.call('GET', accountA) or 0 balanceA = tonumber(balanceA) if balanceA < amount then return 0 end local balanceB = redis.call('GET', accountB) or 0 balanceB = tonumber(balanceB) redis.call('SET', accountA, balanceA - amount) redis.call('SET', accountB, balanceB + amount) return 1" 2 accountA accountB 30

參考

  1. Redis 事務 vs Lua,區別以及如何選擇
  2. 【Redis】- 事務和Lua腳本
  3. Redis 管道、事務、Lua 腳本對比

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

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

相關文章

Linux下的網絡管理配置

一、 IPv4原理 IPv4&#xff08;Internet Protocol version 4&#xff09;&#xff0c;采用32位地址。IPv4地址通常用點分十進制表示&#xff0c;如 192.168.1.10。 IPv4網絡通信基于數據包交換原理&#xff0c;當一臺主機要向另一臺主機發送數據時&#xff0c;會將數據分割成…

基于Python(Django)+SQLite實現(Web)校園助手

校園助手 本校園助手采用 B/S 架構。并已將其部署到服務器上。在網址上輸入 db.uplei.com 即可訪問。 使用說明 可使用如下賬號體驗&#xff1a; 學生界面: 賬號1&#xff1a;123 密碼1&#xff1a;123 賬戶2&#xff1a;201805301348 密碼2&#xff1a;1 # --------------…

unity動態骨骼架設+常用參數分享(包含部分穿模解決方案)

Unity骨骼物理模擬插件Dynamic Bone Dynamic Bone 可用于對角色的骨骼&#xff08;bones&#xff09;或者鉸鏈系統&#xff08;joints&#xff09;施加物理效果。 物理效果可以使得游戲角色的頭發、衣服、胸部或者是其他的任何部位&#xff0c;都可以以近似真實的狀態運動。 …

科技天眼守望農田:珈和衛星遙感監測賦能智慧農業,護航糧食安全新未來

農情監測與糧食安全密切相關&#xff0c;以往農作物的長勢、環境、病蟲害、災情等相關數據和圖像信息都是靠物聯網硬件及縣、鎮、村等人力來完成&#xff0c;不僅要耗費大量人力、物力&#xff0c;而且數據時效性、準確性較差。珈和科技開發建設農情遙感監測系統&#xff0c;運…

【TeamFlow】4.2 Yew庫詳細介紹

Yew 是一個用于構建高效、交互式前端 Web 應用程序的現代 Rust 框架&#xff0c;它借鑒了 React 和 Elm 等框架的設計理念&#xff0c;同時充分利用 Rust 的語言特性。 核心特性 基于組件的架構 Yew 采用組件化開發模式&#xff0c;類似于 React: 組件是可重用的 UI 構建塊 …

畢設 - 數字孿生智慧農場(vue+高德地圖)項目分享

感興趣的同學可以私信我或者在下方添加我的qq 在線地址: 數字孿生智慧農場

深入理解 VMware 虛擬機網絡模式:為虛擬化管理鋪平道路

隨著云計算和虛擬化技術的快速發展&#xff0c;VMware作為行業領軍者&#xff0c;在企業的IT基礎設施中扮演著越來越重要的角色。無論是開發、測試還是生產環境&#xff0c;虛擬機&#xff08;VM&#xff09;都成為了我們不可或缺的工具。在VMware中&#xff0c;網絡是虛擬機能…

安恒安全滲透面試題

《網安面試指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇網安資料庫https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

代碼隨想錄算法訓練營第五十三天 | 105.有向圖的完全可達性 106.島嶼的周長

105.有向圖的完全可達性 題目鏈接&#xff1a;101. 孤島的總面積 文章講解&#xff1a;代碼隨想錄 視頻講解&#xff1a;圖論&#xff1a;島嶼問題再出新花樣 | 深搜優先搜索 | 卡碼網&#xff1a;101.孤島總面積_嗶哩嗶哩_bilibili 思路&#xff1a; 1.確認遞歸函數&…

藍橋杯 18.分考場

分考場 原題目鏈接 題目描述 有 n 個人參加某項特殊考試。 為了公平&#xff0c;要求任何兩個認識的人不能分在同一個考場。 你的任務是求出最少需要分幾個考場才能滿足這個條件。 輸入描述 第一行&#xff1a;一個整數 n&#xff0c;表示參加考試的人數&#xff08;1 ≤…

分布式光纖測溫技術讓森林火災預警快人一步

2025年春季&#xff0c;多地接連發生森林火災&#xff0c;累計過火面積超 3萬公頃。春季歷來是森林草原火災易發、多發期&#xff0c;加之清明節已到來&#xff0c;生產生活用火活躍&#xff0c;民俗祭祀用火集中&#xff0c;森林火災風險進一步加大。森林防火&#xff0c;人人…

前端筆記-Vue3(上)

學習參考視頻&#xff1a;尚硅谷Vue3入門到實戰&#xff0c;最新版vue3TypeScript前端開發教程_嗶哩嗶哩_bilibili vue3學習目標&#xff1a; VUE 31、Vue3架構與設計理念2、組合式API&#xff08;Composition API&#xff09;3、常用API&#xff1a;ref、reactive、watch、c…

如何增加 Elasticsearch 中的 primary shard 數量

作者&#xff1a;來自 Elastic Kofi Bartlett 探索增加 Elasticsearch 中 primary shard 數量的方法。 更多閱讀&#xff1a; Elasticsearch&#xff1a;Split index API - 把一個大的索引分拆成更多分片 Elasticsearch&#xff1a;通過 shrink API 減少 shard 數量來縮小 El…

基于SA模擬退火算法的車間調度優化matlab仿真,輸出甘特圖和優化收斂曲線

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SA模擬退火算法的車間調度優化matlab仿真,輸出甘特圖和優化收斂曲線。輸出指標包括最小平均流動時間&#xff0c;最大完工時間&#xff0c;最小間隙時間。 2…

Spring_MVC 快速入門指南

Spring_MVC 快速入門指南 一、Spring_MVC 簡介 1. 什么是 Spring_MVC&#xff1f; Spring_MVC 是 Spring 框架的一個模塊&#xff0c;用于構建 Web 應用程序。它基于 MVC&#xff08;Model-View-Controller&#xff09;設計模式&#xff0c;將應用程序分為模型&#xff08;M…

爬蟲獲取sku信息需要哪些庫

在使用 Python 爬蟲獲取淘寶商品的 SKU 詳細信息時&#xff0c;通常需要以下幾種庫來完成任務。這些庫各有其用途&#xff0c;可以幫助你更高效地實現爬蟲功能。 1. requests 用途&#xff1a;用于發送 HTTP 請求&#xff0c;獲取網頁內容。 安裝&#xff1a; bash pip insta…

賽靈思Xilinx FPGa XCKU15P?2FFVA1156I AMD Kintex UltraScale+

XCKU15P?2FFVA1156I 是 AMD Kintex UltraScale 系列中的高性能 FPGA&#xff0c;基于 16 nm FinFET UltraScale 架構 制造&#xff0c;兼顧卓越的性能與功耗比&#xff0c;該器件集成 1,143,450 個邏輯單元和 82,329,600 位片上 RAM&#xff0c;配備 1,968 個 DSP 切片&#…

從規則到大模型:知識圖譜信息抽取實體NER與關系RE任務近10年演進發展詳解

摘要: 本文回顧了關系抽取與實體抽取領域的經典與新興模型,清晰地梳理了它們的出現時間與核心創新,并給出在 2025 年不同資源與場景下的最佳實踐推薦。文章引用了 BiLSTM?CRF、BiLSTM?CNN?CRF、SpanBERT、LUKE、KnowBERT、CasRel、REBEL、UIE,大模型抽取 等模型的原始論…

基于Django實現農業生產可視化系統

基于Django實現農業生產可視化系統 項目截圖 登錄 注冊 首頁 農業數據-某一指標表格展示 農業數據-某一指標柱狀圖展示 農業數據-某一指標餅狀圖展示 氣候數據-平均氣溫地圖展示 氣候數據-降水量合并圖展示 后臺管理 一、系統簡介 農業生產可視化系統是一款基于DjangoMVTMyS…

【無人機】無人機的電調校準,ESC Calibration,PX4使用手冊電調校準詳細步驟

目錄 1、前提 條件? 2、詳細步驟? 3、故障 排除? 無人機的電調校準&#xff0c;ESC Calibration&#xff0c;PX4使用手冊電調校準詳細步驟 參考&#xff1a;ESC 校準 |PX4 指南 &#xff08;v1.15&#xff09; ?信息 這些說明僅與 PWM ESC 和 OneShot ESC 相關。DShot…