SpringBoot+Redis執(zhí)行l(wèi)ua腳本的5種方式總結(jié)
0.前言
在使用Spring Boot與Redis執(zhí)行Lua腳本之前,讓我們先了解一下Lua腳本在Redis中的作用和優(yōu)勢(shì)。
Lua是一種快速、輕量級(jí)的腳本語言,廣泛應(yīng)用于各種領(lǐng)域,包括數(shù)據(jù)庫。Redis作為一個(gè)內(nèi)嵌Lua解釋器的NoSQL數(shù)據(jù)庫,允許通過Lua腳本在服務(wù)器端執(zhí)行一些復(fù)雜的操作。
使用Lua腳本在Redis中執(zhí)行操作有以下幾個(gè)優(yōu)勢(shì):
減少網(wǎng)絡(luò)開銷:通過將多個(gè)操作封裝在一個(gè)Lua腳本中,可以減少每次操作的網(wǎng)絡(luò)開銷。腳本在服務(wù)器端一次執(zhí)行,減少了客戶端與服務(wù)器之間的通信次數(shù)。
原子性操作:Redis將整個(gè)Lua腳本作為一個(gè)原子性操作執(zhí)行,保證了多個(gè)操作的原子性。這對(duì)于需要執(zhí)行多個(gè)Redis命令來保持?jǐn)?shù)據(jù)一致性的情況非常有用。
原生支持事務(wù):Redis的Lua腳本支持原生的事務(wù)操作,可以在腳本中使用
redis.call
和redis.pcall
來執(zhí)行Redis命令,保證了事務(wù)的一致性。
在Spring Boot中使用Lua腳本執(zhí)行Redis操作非常簡單。您可以使用RedisTemplate或者Lettuce連接庫來執(zhí)行Lua腳本。這些庫提供了相應(yīng)的方法來執(zhí)行Lua腳本并獲取執(zhí)行結(jié)果。
1.基礎(chǔ)介紹
接下來,我們將提供一個(gè)示例來說明如何在Spring Boot中執(zhí)行Lua腳本。示例將使用RedisTemplate來執(zhí)行腳本。
2.步驟
2.1. 引入依賴
當(dāng)使用Spring Boot和Redis執(zhí)行Lua腳本時(shí)
1. 使用Jedis作為Redis客戶端:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
這些依賴將引入Spring Boot的Redis支持和Jedis作為Redis客戶端。
2. 使用Lettuce作為Redis客戶端:
默認(rèn)使用Lettuce所以不需要引入依賴。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
注意:確保使用的依賴版本與您的項(xiàng)目和其他依賴的版本兼容。您可以根據(jù)需要調(diào)整依賴的版本號(hào)。
2.2. 配置文件
配置文件
使用Jedis作為Redis客戶端的配置文件(application.properties
):
# Redis連接配置 spring.redis.host=your-redis-host spring.redis.port=your-redis-port spring.redis.password=your-redis-password # Jedis相關(guān)配置(可選) # spring.redis.jedis.pool.max-active=10 # spring.redis.jedis.pool.max-idle=5 # spring.redis.jedis.pool.min-idle=1 # spring.redis.jedis.pool.max-wait=-1
使用Lettuce作為Redis客戶端的配置文件(application.properties
):
# Redis連接配置 spring.redis.host=your-redis-host spring.redis.port=your-redis-port spring.redis.password=your-redis-password # Lettuce相關(guān)配置(可選) # spring.redis.lettuce.pool.max-active=10 # spring.redis.lettuce.pool.max-idle=5 # spring.redis.lettuce.pool.min-idle=1 # spring.redis.lettuce.pool.max-wait=-1
上述配置文件中的your-redis-host、your-redis-port和your-redis-password應(yīng)該替換為實(shí)際的Redis連接信息。如果Redis服務(wù)器沒有密碼,則可以省略spring.redis.password配置。
對(duì)于Jedis和Lettuce客戶端,您還可以根據(jù)需要配置連接池的相關(guān)屬性。在示例配置中,我已經(jīng)提供了一些可選的連接池屬性,您可以根據(jù)應(yīng)用程序的需求進(jìn)行調(diào)整。
2.3. 使用示例
每種方式都適用于不同的使用場(chǎng)景和偏好,您可以根據(jù)自己的需求選擇適合的方式來執(zhí)行Lua腳本。
1. RedisTemplate.execute(RedisScript script, List keys, Object… args):
@Autowired private RedisTemplate<String, String> redisTemplate; public void executeLuaScript() { String luaScript = "return redis.call('GET', KEYS[1])"; RedisScript<String> redisScript = new DefaultRedisScript<>(luaScript, String.class); List<String> keys = Arrays.asList("key1"); String result = redisTemplate.execute(redisScript, keys); System.out.println(result); }
這種方式使用RedisTemplate的execute方法執(zhí)行Lua腳本。首先,我們創(chuàng)建一個(gè)RedisScript對(duì)象,將Lua腳本作為字符串傳遞給它。然后,我們提供一個(gè)包含鍵的列表和其他參數(shù)(如果有的話)作為execute方法的參數(shù)。在本示例中,我們使用Lua腳本調(diào)用Redis的GET命令來獲取名為"key1"的鍵的值。
2. RedisTemplate.execute(RedisCallback action):
@Autowired private RedisTemplate<String, String> redisTemplate; public void executeLuaScript() { String luaScript = "return redis.call('GET', KEYS[1])"; String result = redisTemplate.execute(new RedisCallback<String>() { @Override public String doInRedis(RedisConnection connection) throws DataAccessException { Object nativeConnection = connection.getNativeConnection(); if (nativeConnection instanceof Jedis) { // Jedis specific code Jedis jedis = (Jedis) nativeConnection; return jedis.eval(luaScript, 1, "key1"); } else if (nativeConnection instanceof LettuceConnection) { // Lettuce specific code LettuceConnection lettuceConnection = (LettuceConnection) nativeConnection; RedisCommands<String, String> commands = lettuceConnection.sync(); return commands.eval(luaScript, ScriptOutputType.VALUE, new String[]{"key1"}); } // Handle other Redis clients if needed return null; } }); System.out.println(result); }
這種方式使用RedisTemplate的execute方法,并傳遞一個(gè)RedisCallback對(duì)象。在doInRedis方法中,我們可以使用RedisConnection對(duì)象與底層Redis進(jìn)行交互。根據(jù)底層Redis客戶端的不同(例如Jedis或Lettuce),我們可以執(zhí)行相應(yīng)的Lua腳本。在本示例中,我們使用Jedis和Lettuce分別執(zhí)行Lua腳本。
3. RedisScriptingCommands.eval(String script, ReturnType returnType, int numKeys, byte[]… keysAndArgs):
@Autowired private RedisConnectionFactory redisConnectionFactory; public void executeLuaScript() { RedisConnection connection = redisConnectionFactory.getConnection(); String luaScript = "return redis.call('GET', KEYS[1])"; Object result = connection.eval(luaScript.getBytes(), ReturnType.VALUE, 1, "key1".getBytes()); System.out.println(result); connection.close(); }
這種方式使用RedisConnection對(duì)象的eval方法直接執(zhí)行Lua腳本。我們獲取RedisConnection對(duì)象,并傳遞Lua腳本的字節(jié)數(shù)組、返回類型、鍵的數(shù)量和鍵及其參數(shù)的字節(jié)數(shù)組。在本示例中,我們執(zhí)行了一個(gè)簡單的Lua腳本,調(diào)用Redis的GET命令來獲取名為"key1"的鍵的值。
4. 使用Lettuce的Reactive Redis API:
@Autowired private ReactiveRedisTemplate<String, String> reactiveRedisTemplate; public Mono<String> executeLuaScript() { String luaScript = "return redis.call('GET', KEYS[1])"; RedisScript<String> redisScript = new DefaultRedisScript<>(luaScript, String.class); List<String> keys = Arrays.asList("key1"); return reactiveRedisTemplate.execute(redisScript, keys); }
這種方式適用于響應(yīng)式編程風(fēng)格的應(yīng)用程序,使用Lettuce的Reactive Redis API執(zhí)行Lua腳本。我們創(chuàng)建一個(gè)ReactiveRedisTemplate對(duì)象,并使用execute方法執(zhí)行Lua腳本。在本示例中,我們調(diào)用Redis的GET命令來獲取名為"key1"的鍵的值,并返回一個(gè)Mono對(duì)象。
5. 使用Lettuce的StatefulRedisConnection.sync():
@Autowired private RedisClient redisClient; public void executeLuaScript() { StatefulRedisConnection<String, String> connection = redisClient.connect(); RedisCommands<String, String> commands = connection.sync(); String luaScript = "return redis.call('GET', KEYS[1])"; String result = commands.eval(luaScript, ScriptOutputType.VALUE, "key1"); System.out.println(result); connection.close(); }
這種方式使用Lettuce的RedisClient創(chuàng)建一個(gè)StatefulRedisConnection對(duì)象,并使用sync()方法獲取同步執(zhí)行的RedisCommands。然后,我們可以使用eval方法執(zhí)行Lua腳本。在本示例中,我們執(zhí)行一個(gè)簡單的Lua腳本,調(diào)用Redis的GET命令來獲取名為"key1"的鍵的值。
3.參考文檔
Spring Boot官方文檔 ↗: Spring Boot官方文檔提供了關(guān)于使用Spring Boot構(gòu)建應(yīng)用程序的詳細(xì)指南和參考文檔。
Spring Data Redis官方文檔 ↗: Spring Data Redis官方文檔提供了關(guān)于在Spring應(yīng)用程序中使用Redis的詳細(xì)信息,包括數(shù)據(jù)訪問、事務(wù)管理、緩存等方面的內(nèi)容。
Redis官方文檔 ↗: Redis官方文檔是Redis數(shù)據(jù)庫的官方指南,提供了全面的文檔和示例,涵蓋了Redis的各個(gè)方面,包括數(shù)據(jù)類型、命令、持久化、復(fù)制等。
以上就是SpringBoot+Redis執(zhí)行l(wèi)ua腳本的5種方式總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Redis執(zhí)行l(wèi)ua腳本的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Springboot+Redis執(zhí)行l(wèi)ua腳本的項(xiàng)目實(shí)踐
- springboot使用redisTemplate操作lua腳本
- springboot中使用redis并且執(zhí)行調(diào)試lua腳本
- SpringBoot通過redisTemplate調(diào)用lua腳本并打印調(diào)試信息到redis log(方法步驟詳解)
- SpringBoot通過RedisTemplate執(zhí)行Lua腳本的方法步驟
- SpringBoot+Redis執(zhí)行l(wèi)ua腳本的方法步驟
- SpringBoot利用注解來實(shí)現(xiàn)Redis分布式鎖
- SpringBoot基于Redis的分布式鎖實(shí)現(xiàn)過程記錄
- 關(guān)于SpringBoot 使用 Redis 分布式鎖解決并發(fā)問題
- springboot+redis+lua實(shí)現(xiàn)分布式鎖的腳本
相關(guān)文章
java異常繼承何類,運(yùn)行時(shí)異常與一般異常的區(qū)別(詳解)
下面小編就為大家?guī)硪黄猨ava異常繼承何類,運(yùn)行時(shí)異常與一般異常的區(qū)別(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11Spring Boot非Web項(xiàng)目運(yùn)行配置的方法教程
這篇文章主要介紹了Spring Boot非Web項(xiàng)目運(yùn)行配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Java將List轉(zhuǎn)換為String的幾種常見方式
在實(shí)際開發(fā)中經(jīng)常遇到List轉(zhuǎn)為String字符串的情況,下面這篇文章主要給大家介紹了關(guān)于Java將List轉(zhuǎn)換為String的幾種常見方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03非常適合新手學(xué)生的Java線程池優(yōu)化升級(jí)版
作者是一個(gè)來自河源的大三在校生,以下筆記都是作者自學(xué)之路的一些淺薄經(jīng)驗(yàn),如有錯(cuò)誤請(qǐng)指正,將來會(huì)不斷的完善筆記,幫助更多的Java愛好者入門2022-03-03Java實(shí)現(xiàn)FTP文件的上傳和下載功能的實(shí)例代碼
FTP 是File Transfer Protocol(文件傳輸協(xié)議)的英文簡稱,而中文簡稱為“文傳協(xié)議”。接下來通過本文給大家實(shí)例講解Java實(shí)現(xiàn)FTP文件的上傳和下載功能,需要的的朋友一起看看吧2016-11-11Hadoop運(yùn)行時(shí)遇到j(luò)ava.io.FileNotFoundException錯(cuò)誤的解決方法
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Hadoop運(yùn)行時(shí)遇到j(luò)ava.io.FileNotFoundException錯(cuò)誤展開,文中有非常詳細(xì)的解決方法,需要的朋友可以參考下2021-06-06SpringCloud 2020-Ribbon負(fù)載均衡服務(wù)調(diào)用的實(shí)現(xiàn)
這篇文章主要介紹了SpringCloud 2020-Ribbon負(fù)載均衡服務(wù)調(diào)用的實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03