Redis 除了數據類型外的核心功能 的詳細說明,包含事務、流水線、發布/訂閱、Lua 腳本的完整代碼示例和表格總結

以下是 Redis 除了數據類型外的核心功能 的詳細說明,包含事務、流水線、發布/訂閱、Lua 腳本的完整代碼示例和表格總結:


1. Redis 事務(Transactions)

功能描述

事務通過 MULTIEXEC 命令將一組命令打包執行,保證命令的原子性(非嚴格原子性)。事務中的命令會被順序執行,但中間可能被其他客戶端命令插入。

代碼示例
@Service
public class RedisTransactionService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 使用事務操作public void transactionExample() {redisTemplate.multi(); // 開啟事務try {// 添加多個命令到事務隊列redisTemplate.opsForValue().set("key1", "value1");redisTemplate.opsForValue().increment("counter", 1);// 提交事務List<Object> results = redisTemplate.exec();System.out.println("事務執行結果:" + results);} catch (Exception e) {redisTemplate.discard(); // 回滾事務throw e;}}
}
注意事項
  • 事務中的命令若失敗,后續命令仍會執行。
  • 使用 exec() 提交后,返回所有命令的執行結果列表。

2. Redis 流水線(Pipeline)

功能描述

流水線將多個命令批量發送到 Redis 服務器,減少網絡往返延遲,提升性能。適用于批量操作(如批量讀寫)。

代碼示例
@Service
public class RedisPipelineService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 使用流水線批量操作public void pipelineExample() {redisTemplate.executePipelined((RedisConnection connection) -> {connection.set("key1".getBytes(), "value1".getBytes());connection.set("key2".getBytes(), "value2".getBytes());connection.set("key3".getBytes(), "value3".getBytes());return null;});}
}
注意事項
  • 流水線通過 executePipelined 方法實現,需操作底層 RedisConnection
  • 批量操作需自行處理字節序列化。

3. Redis 發布/訂閱(Pub/Sub)

功能描述

用于實時消息通信:

  • 發布者:向頻道(channel)發送消息。
  • 訂閱者:監聽指定頻道的消息。
代碼示例
3.1 發布者
@Service
public class RedisPublisherService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 發布消息到頻道public void publishMessage(String channel, String message) {redisTemplate.convertAndSend(channel, message);}
}
3.2 訂閱者
@Configuration
public class RedisSubscriberConfig {@Beanpublic RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);container.addMessageListener(new MessageListener() {@Overridepublic void onMessage(Message message, byte[] pattern) {String channel = new String(message.getChannel());String payload = new String(message.getBody());System.out.println("收到消息:頻道[" + channel + "],內容[" + payload + "]");}}, new PatternTopic("channel:*")); // 訂閱所有以 "channel:" 開頭的頻道return container;}
}
注意事項
  • 需配置 RedisMessageListenerContainer 監聽消息。
  • 消息不會持久化,客戶端斷開后未接收的消息會丟失。

4. Redis Lua 腳本(Lua Scripting)

功能描述

通過 Lua 腳本實現 原子性操作,適用于需要嚴格一致性的場景(如分布式鎖、庫存扣減)。Lua 腳本在 Redis 服務端單線程執行,確保原子性。

代碼示例
4.1 示例腳本:庫存扣減
-- Lua 腳本:扣減庫存,僅當庫存大于0時扣減
local stock = tonumber(redis.call("GET", KEYS[1]))
if stock and stock > 0 thenredis.call("DECR", KEYS[1])return stock - 1
elsereturn -1 -- 庫存不足
end
4.2 Spring Boot 調用 Lua 腳本
@Service
public class RedisLuaService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 執行 Lua 腳本(庫存扣減)public Long deductStock(String stockKey) {DefaultRedisScript<Long> script = new DefaultRedisScript<>();script.setScriptText(loadLuaScript("deduct_stock.lua")); // 加載腳本內容script.setResultType(Long.class);return redisTemplate.execute(script, Collections.singletonList(stockKey), new Object[]{});}// 加載 Lua 腳本內容(示例)private String loadLuaScript(String scriptName) {// 實際開發中可從文件或資源加載return "local stock = tonumber(redis.call('GET', KEYS[1])) ..."; // 省略腳本內容}
}
注意事項
  • 腳本在 Redis 服務端執行,需確保腳本邏輯正確。
  • 可通過 SHA1 哈希緩存腳本,減少傳輸開銷。

5. 總結表格

功能描述代碼方法適用場景
事務將一組命令打包執行,保證順序性,但非嚴格原子性。redisTemplate.multi()redisTemplate.exec()需要命令順序執行但允許部分失敗的場景。
流水線批量發送命令,減少網絡延遲。redisTemplate.executePipelined()大批量讀寫操作(如批量插入、查詢)。
發布/訂閱實時消息通信,支持頻道或模式訂閱。redisTemplate.convertAndSend()RedisMessageListenerContainer實時通知(如訂單狀態更新、聊天消息)。
Lua 腳本在 Redis 服務端原子性執行復雜邏輯,確保數據一致性。redisTemplate.execute(script, keys, args)需要嚴格原子性的操作(如分布式鎖、扣減庫存)。

6. 關鍵點總結

  1. 事務 vs Lua 腳本

    • 事務提供順序執行,但非原子性(中間可能被其他命令中斷)。
    • Lua 腳本確保原子性,適合需要嚴格一致性的場景。
  2. 流水線優化

    • 批量操作時,流水線可顯著提升性能(減少網絡 RTT)。
  3. 發布/訂閱

    • 適用于實時消息通信,但需注意消息丟失風險(客戶端斷開時未接收的消息會丟失)。
  4. Lua 腳本注意事項

    • 腳本在服務端執行,需謹慎設計邏輯(避免死循環或高耗時操作)。
    • 可通過 EVALSHA 命令緩存腳本,減少傳輸開銷。

通過合理使用這些功能,可以解決高并發場景下的性能、一致性和實時性挑戰。

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

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

相關文章

STM32F103C8T6單片機硬核原理篇:討論GPIO的基本原理篇章1——只討論我們的GPIO簡單輸入和輸出

目錄 前言 輸出時的GPIO控制部分 標準庫是如何操作寄存器完成GPIO驅動的初始化的&#xff1f; 問題1&#xff1a;如何掌握GPIO的編程細節——跟寄存器如何打交道 問題2&#xff1a;哪些寄存器&#xff0c;去哪里找呢&#xff1f; 問題三&#xff0c;寄存器的含義&#xff…

前端布局難題:父元素padding導致子元素無法全屏?3種解決方案

大家好&#xff0c;我是一諾。今天要跟大家分享一個我在實際項目中經常用到的CSS技巧——如何讓子元素突破父元素的padding限制&#xff0c;實現真正的全屏寬度效果。 為什么會有這個需求&#xff1f; 記得我剛入行的時候&#xff0c;接到一個需求&#xff1a;要在內容區插入…

當網頁受到DDOS網絡攻擊有哪些應對方法?

分布式拒絕服務攻擊也是人們較為熟悉的DDOS攻擊&#xff0c;這類攻擊會通過大量受控制的僵尸網絡向目標服務器發送請求&#xff0c;以此來消耗服務器中的資源&#xff0c;致使用戶無法正常訪問&#xff0c;當網頁受到分布式拒絕服務攻擊時都有哪些應對方法呢&#xff1f; 建立全…

LeNet-5簡介及matlab實現

文章目錄 一、LeNet-5網絡結構簡介二、LeNet-5每一層的實現原理2.1. 第一層 (C1) &#xff1a;卷積層&#xff08;Convolution Layer&#xff09;2.2. 第二層 (S2) &#xff1a;池化層&#xff08;Pooling Layer&#xff09;2.3. 第三層&#xff08;C3&#xff09;&#xff1a;…

【LLM】MCP(Python):實現 stdio 通信的Client與Server

本文將詳細介紹如何使用 Model Context Protocol (MCP) 在 Python 中實現基于 STDIO 通信的 Client 與 Server。MCP 是一個開放協議&#xff0c;它使 LLM 應用與外部數據源和工具之間的無縫集成成為可能。無論你是構建 AI 驅動的 IDE、改善 chat 交互&#xff0c;還是構建自定義…

Docker 安裝 Elasticsearch 教程

目錄 一、安裝 Elasticsearch 二、安裝 Kibana 三、安裝 IK 分詞器 四、Elasticsearch 常用配置 五、Elasticsearch 常用命令 一、安裝 Elasticsearch &#xff08;一&#xff09;創建 Docker 網絡 因為后續還需要部署 Kibana 容器&#xff0c;所以需要讓 Elasticsearch…

Swagger @ApiOperation

ApiOperation 注解并非 Spring Boot 自帶的注解&#xff0c;而是來自 Swagger 框架&#xff0c;Swagger 是一個規范且完整的框架&#xff0c;用于生成、描述、調用和可視化 RESTful 風格的 Web 服務&#xff0c;而 ApiOperation 主要用于為 API 接口的操作添加描述信息。以下為…

【奇點時刻】GPT4o新圖像生成模型底層原理深度洞察報告(篇2)

由于上一篇解析深度不足&#xff0c;經過查看學習相關論文&#xff0c;以下是一份對 GPT-4o 最新的圖像生成模型 的深度梳理與洞察&#xff0c;從模型原理到社區解讀、對比傳統擴散模型&#xff0c;再到對未來趨勢的分析。為了便于閱讀&#xff0c;整理成以下七個部分&#xff…

C# 窗體應用(.FET Framework ) 打開文件操作

一、 打開文件或文件夾加載數據 1. 定義一個列表用來接收路徑 public List<string> paths new List<string>();2. 打開文件選擇一個文件并將文件放入列表中 OpenFileDialog open new OpenFileDialog(); // 過濾 open.Filter "(*.jpg;*.jpge;*.bmp;*.png…

Scala 面向對象編程總結

???抽象屬性和抽象方法 基本語法 定義抽象類&#xff1a;abstract class Person{} //通過 abstract 關鍵字標記抽象類定義抽象屬性&#xff1a;val|var name:String //一個屬性沒有初始化&#xff0c;就是抽象屬性定義抽象方法&#xff1a;def hello():String //只聲明而沒…

人工智能賦能工業制造:智能制造的未來之路

一、引言 隨著人工智能技術的飛速發展&#xff0c;其應用場景不斷拓展&#xff0c;從消費電子到醫療健康&#xff0c;從金融科技到交通運輸&#xff0c;幾乎涵蓋了所有行業。而工業制造作為國民經濟的支柱產業&#xff0c;也在人工智能的浪潮中迎來了深刻的變革。智能制造&…

元宇宙概念下,UI 設計如何打造沉浸式體驗?

一、元宇宙時代UI設計的核心趨勢 在元宇宙概念下&#xff0c;UI設計的核心目標是打造沉浸式體驗&#xff0c;讓用戶在虛擬世界中感受到身臨其境的交互效果。以下是元宇宙時代UI設計的幾個核心趨勢&#xff1a; 沉浸式體驗設計 元宇宙的核心是提供沉浸式體驗&#xff0c;UI設計…

AI 如何幫助我們提升自己,不被替代

在當今快速發展的時代&#xff0c;人工智能&#xff08;AI&#xff09;正逐漸滲透到生活的方方面面。許多人擔心 AI 會取代人類的工作&#xff0c;然而&#xff0c;AI 更多的是作為一種強大的賦能工具&#xff0c;幫助我們提升自身能力&#xff0c;讓我們在工作中更具競爭力。以…

基于SpringBoot+Vue實現的二手交易市場平臺功能一

一、前言介紹&#xff1a; 1.1 項目摘要 隨著社會的發展和人們生活水平的提高&#xff0c;消費者購買能力的提升導致產生了大量的閑置物品&#xff0c;這些閑置物品具有一定的經濟價值。特別是在高校環境中&#xff0c;學生群體作為一個具有一定消費水平的群體&#xff0c;每…

k8s安裝cri驅動創建storageclass動態類

部署nfs服務器 #所有k8s節點安裝nfs客戶端 yum install -y nfs-utils mkdir -p /nfs/share echo "/nfs/share *(rw,sync,no_root_squash)" >> /etc/exports systemctl enable --now nfs-serverhelm部署nfs的provisioner&sc 所有k8s節點安裝客戶端 yu…

SpringBoot + Netty + Vue + WebSocket實現在線聊天

最近想學學WebSocket做一個實時通訊的練手項目 主要用到的技術棧是WebSocket Netty Vue Pinia MySQL SpringBoot&#xff0c;實現一個持久化數據&#xff0c;單一群聊&#xff0c;支持多用戶的聊天界面 下面是實現的過程 后端 SpringBoot啟動的時候會占用一個端口&#xff…

大數據Spark(五十七):Spark運行架構與MapReduce區別

文章目錄 Spark運行架構與MapReduce區別 一、Spark運行架構 二、Spark與MapReduce區別 Spark運行架構與MapReduce區別 一、Spark運行架構 Master:Spark集群中資源管理主節點&#xff0c;負責管理Worker節點。Worker:Spark集群中資源管理的從節點&#xff0c;負責任務的運行…

【爬蟲】網頁抓包工具--Fiddler

網頁抓包工具對比&#xff1a;Fiddler與Sniff Master Fiddler基礎知識 Fiddler是一款強大的抓包工具&#xff0c;它的工作原理是作為web代理服務器運行&#xff0c;默認代理地址是127.0.0.1&#xff0c;端口8888。代理服務器位于客戶端和服務器之間&#xff0c;攔截所有HTTP/…

Redis:集群

為什么要有集群&#xff1f; Redis 集群&#xff08;Redis Cluster&#xff09;是 Redis 官方提供的分布式解決方案&#xff0c;用于解決單機 Redis 在數據容量、并發處理能力和高可用性上的局限。通過 Redis 集群&#xff0c;可以實現數據分片、故障轉移和高可用性&#xff0…

【2012】【論文筆記】太赫茲波在非磁化等離子體——

前言 類型 太赫茲 + 等離子體 太赫茲 + 等離子體 太赫茲+等離子體 期刊 物理學報 物理學報 物理學報 作者