Spring Boot 集成Redis 的Lua腳本詳解

1. 對比Lua腳本方案與Redis自身事務

對比表格
對比維度Redis事務(MULTI/EXEC)Lua腳本方案
原子性事務命令序列化執行,但中間可被其他命令打斷,不保證原子性Lua腳本在Redis單線程中原子執行,不可中斷
計算能力僅支持Redis內置命令,無法復雜計算支持Lua腳本,可實現復雜邏輯運算
性能需多次網絡交互,性能較低通過SHA1復用腳本,減少網絡傳輸,性能更高
適用場景簡單命令序列化執行需要原子性且涉及復雜計算的場景

2. 兩種運行Lua腳本的方法示例

方法1:直接發送Lua腳本(不緩存)
  
-- Lua腳本:將key1的值加1,并返回新值  
local value = tonumber(redis.call('GET', KEYS[1]))  
redis.call('SET', KEYS[1], value + 1)  
return value + 1  

Java代碼:

  
// 直接執行Lua腳本,每次傳遞腳本內容  
RedisScript<Long> script = new DefaultRedisScript<>(  "local v=tonumber(redis.call('GET', KEYS[1])); " +  "redis.call('SET', KEYS[1], v+1); return v+1", Long.class);  
Long result = redisTemplate.execute(  script, Arrays.asList("key1"), new Object[]{});  
方法2:先緩存SHA1后調用
  
-- 先執行以下腳本緩存到Redis  
// 第一次執行時緩存腳本  
String script = "...(同上)...";  
String sha1 = redisTemplate.execute(new DefaultRedisScript<>(script, Object.class)).getSha();  // 獲取SHA1  // 后續調用時僅傳SHA1和參數  
redisTemplate.execute(  new DefaultRedisScript<Long>(sha1, Long.class),  Arrays.asList("key1"), new Object[]{});  

3. RedisScript接口及子類詳解

RedisScript接口方法說明
方法名作用描述
getSha()返回腳本的SHA1哈希值(若已緩存)
getArgsCount()返回腳本需要的參數數量
getNumberParams()是否需要參數(已廢棄,建議用getArgsCount()
getBody()返回腳本的原始內容(若未緩存)
DefaultRedisScript類
  • 構造方法

    
    new DefaultRedisScript<>(scriptContent, returnType); // 傳入腳本內容  
    new DefaultRedisScript<>(sha1, returnType);         // 傳入SHA1  
    
  • 關鍵方法

    
    // 設置腳本內容  
    script.setScriptText("lua script content");  
    // 設置SHA1(需確保腳本已緩存)  
    script.setSha("computed_sha1");  
    // 設置參數數量  
    script.setArgsCount(2);  
    

4. RedisTemplate的execute()方法對比

方法1:默認序列化器
  
// 使用默認序列化器(如StringRedisSerializer)  
public <T> T execute(RedisScript<T> script, List<K> keys, Object... args) { ... }  // 示例:執行計數器腳本  
RedisScript<Long> script = new DefaultRedisScript<>(  "return tonumber(redis.call('INCR', KEYS[1]))", Long.class);  
Long result = redisTemplate.execute(  script, Arrays.asList("counter_key"), new Object[]{});  
方法2:自定義序列化器
  
// 自定義參數和結果的序列化方式  
public <T> T execute(RedisScript<T> script,  RedisSerializer<?> argsSerializer,  RedisSerializer<T> resultSerializer,  List<K> keys, Object... args) { ... }  // 示例:處理JSON參數和結果  
RedisScript<MyObject> script = ...;  
MyObject result = redisTemplate.execute(  script,  Jackson2JsonRedisSerializer.class,  // 參數序列化器  new Jackson2JsonRedisSerializer<>(MyObject.class), // 結果序列化器  Arrays.asList("key"),  new MyParamObject() // 自定義參數對象  
);  
對比表格
方法版本參數序列化器結果序列化器適用場景
默認方法使用RedisTemplate默認配置使用RedisTemplate默認配置簡單類型(如String、Long)
自定義方法可指定任意RedisSerializer可指定任意RedisSerializer復雜對象(如JSON、POJO)

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

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

相關文章

【大模型】DeepSeek + 藍耕MaaS平臺 + 海螺AI生成高質量視頻操作詳解

目錄 一、前言 二、藍耘智能云MaaS平臺介紹 2.1 藍耘智算平臺是什么 2.2 平臺優勢 2.3 平臺核心能力 三、海螺AI視頻介紹 3.1 海螺AI視頻是什么 3.2 海螺AI視頻主要功能 3.3 海螺AI視頻應用場景 3.4 海螺AI視頻核心優勢 3.5 項目git地址 四、藍耘MaaS平臺DeepSeek海…

12-產品經理-維護模塊

需求模塊是幫助產品經理進行需求的分類和維護。 1. 維護模塊 在具體產品的“研發需求”頁面左側&#xff0c;點擊“維護模塊”。也可以在具體產品的“設置”-“模塊”下進行維護。 點擊保存后&#xff0c;返回模塊頁面。還可以點擊“子模塊”對已有模塊進行子模塊的維護。 點擊…

考研單詞筆記 2025.04.06

area n領域&#xff0c;范圍&#xff0c;方面&#xff0c;地區&#xff0c;地方&#xff0c;場地&#xff0c;面積 aspect n方面&#xff0c;層面&#xff0c;外表&#xff0c;外觀 boundary n限度&#xff0c;界限&#xff0c;分界線&#xff0c;邊界 cap n最高限額&#x…

護網藍初面試題

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

玄機-apache日志分析

靶場任務 1、提交當天訪問次數最多的IP&#xff0c;即黑客IP&#xff1a; 查看apache日志 apache訪問日志的位置是&#xff1a;/var/log/apache2/access.log.1 匹配正則算法 首先先cat看看 發現地址都在第一行&#xff0c;直接匹配計算輸出 cat access.log.1 |grep -Eo &…

C++ I/O 流通俗指南

1. std::ostream 是什么&#xff1f; 定義&#xff1a;std::ostream 是 C 標準庫中的輸出流類&#xff0c;負責將數據輸出到各種目標&#xff08;如屏幕、文件、網絡等&#xff09;。你可以把 std::ostream 想象成一根“數據水管”&#xff1a; 數據從 C 代碼流進 std::ostrea…

Systemd 使用教程(二):Unit 的概念

目錄 【二】 Systemd 單元&#xff08;Unit&#xff09;的概念 本教程將由淺入深的介紹 linux 中 Systemd 的知識和相關使用&#xff08;同時也方便自己后續查閱&#xff09; 【二】 Systemd 單元&#xff08;Unit&#xff09;的概念 雖然我想介紹的比較偏實際操作&#xff0…

樹莓派PICO 設備燒錄成cmsis dap

文章目錄 1. 實際操作2. IO連接 1. 實際操作 2. IO連接

IntelliJ IDEA中Spring Boot 3.4.x+集成Redis 7.x:最新配置與實戰指南

?前言 Spring Boot 3.4.x作為當前?最新穩定版本?&#xff0c;全面支持Java 17與Jakarta EE 10規范。本文以?Spring Boot 3.4.1?和?Redis 7.x?為例&#xff0c;詳解如何在IDEA中快速接入Redis&#xff0c;涵蓋?最新依賴配置?、?數據序列化優化?、?緩存注解?及?高…

VectorBT:使用PyTorch+Transformer訓練和回測股票模型 進階五

VectorBT&#xff1a;使用PyTorchTransformer訓練和回測股票模型 進階五 本方案基于PyTorch框架與Transformer模型&#xff0c;結合VectorBT回測引擎構建多股票量化交易系統&#xff0c;采用滑動窗口技術構建時序特征&#xff0c;通過自注意力機制捕捉市場規律預測收益率&#…

4.3-4.6學習總結 Java:Set系列集合+雙列集合+Map

Set系列集合&#xff1a; 元素是唯一的。 HashSet&#xff1a; 哈希值&#xff1a; 如果沒有重寫hashcode方法和equals方法&#xff0c;那么哈希值是根據地址值計算的。 LinkedHashSet&#xff1a; TreeSet底層為紅黑樹。 紅黑樹&#xff1a;兩個紅色節點不能相連。 雙列集合&…

unreal engine5開發仿鬼泣5的游戲,把敵人擊飛到空中4連擊

UE5系列文章目錄 文章目錄 UE5系列文章目錄前言一、實現思路二、具體藍圖 前言 unreal engine5開發仿鬼泣5的游戲&#xff0c;把敵人擊飛到空中4連擊&#xff0c;先看下效果 一、實現思路 unreal engine5開發仿鬼泣5的游戲&#xff0c;把敵人擊飛到空中4連擊 在Unreal Engi…

功耗日志抓取需求

最近羅列了一些功耗分析需要的常見日志&#xff1a; 測試功耗前&#xff1a; adb shell dumpsys batterystats --reset adb shell dumpsys batterystats --enable full-wake-history 測試功耗后&#xff0c;使用腳本導出如下功耗日志&#xff1a; 腳本 chmod x collect_logs.s…

Java后端開發流程

Java后端開發流程 目錄 開發流程概述具體實現步驟開發最佳實踐項目結構示例代碼示例常見問題與解決方案 開發流程概述 Java后端開發是一個系統化的過程&#xff0c;通常包括以下幾個主要階段&#xff1a; 1. 需求分析階段 業務需求收集&#xff1a;與產品經理、業務方溝通…

Java項目之基于ssm的孩童收養信息管理(源碼+文檔)

項目簡介 孩童收養信息管理實現了以下功能&#xff1a; 實現了用戶在線選擇試題并完成答題&#xff0c;在線查看考核分數。管理員管理字典管理、收養管理、收養信息更改記錄管理、收養者配偶管理、送養管理、員工管理、管理員管理等功能。 &#x1f495;&#x1f495;作者&am…

查詢條件與查詢數據的ajax拼裝

下面我將介紹如何使用 AJAX 動態拼裝查詢條件和獲取查詢數據&#xff0c;包括前端和后端的完整實現方案。 一、前端實現方案 1. 基礎 HTML 結構 html 復制 <div class"query-container"><!-- 查詢條件表單 --><form id"queryForm">…

【算法競賽】狀態壓縮型背包問題經典應用(藍橋杯2019A4分糖果)

在藍橋杯中遇到的這道題&#xff0c;看上去比較普通&#xff0c;但其實蘊含了很巧妙的“狀態壓縮 背包”的思想&#xff0c;本文將從零到一&#xff0c;詳細解析這個問題。 目錄 一、題目 二、思路分析&#xff1a;狀態壓縮 最小覆蓋 1. 本質&#xff1a;最小集合覆蓋問題…

STL 性能優化實戰:解決項目中標準模板庫的性能瓶頸

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、全棧領域優質創作者、高級開發工程師、高級信息系統項目管理師、系統架構師&#xff0c;數學與應用數學專業&#xff0c;10年以上多種混合語言開發經驗&#xff0c;從事DICOM醫學影像開發領域多年&#xff0c;熟悉DICOM協議及…

大模型如何優化數字人的實時交互與情感表達

標題:大模型如何優化數字人的實時交互與情感表達 內容:1.摘要 隨著人工智能技術的飛速發展&#xff0c;數字人在多個領域的應用愈發廣泛&#xff0c;其實時交互與情感表達能力成為提升用戶體驗的關鍵因素。本文旨在探討大模型如何優化數字人的實時交互與情感表達。通過分析大模…

qt designer 軟件主題程序設計

對于使用Qt Designer設計的界面&#xff0c;主題切換的實現需要結合Qt的信號槽機制、樣式表動態加載以及資源管理。以下是針對Qt Designer UI的詳細解決方案&#xff1a; 一、UI文件與主題系統的整合架構 二、核心實現步驟 1. 動態樣式表加載系統 // ThemeManager.h class …