SpringBoot通過RedisTemplate執(zhí)行Lua腳本的方法步驟
lua 腳本
Redis 中使用 lua 腳本,我們需要注意的是,從 Redis 2.6.0后才支持 lua 腳本的執(zhí)行。
使用 lua 腳本的好處:
原子操作:lua腳本是作為一個整體執(zhí)行的,所以中間不會被其他命令插入。
減少網(wǎng)絡(luò)開銷:可以將多個請求通過腳本的形式一次發(fā)送,減少網(wǎng)絡(luò)時延。
復(fù)用性:lua腳本可以常駐在redis內(nèi)存中,所以在使用的時候,可以直接拿來復(fù)用,也減少了代碼量。
1.RedisScript
首先你得引入spring-boot-starter-data-redis依賴,其次把lua腳本放在resources目錄下。
@Bean public DefaultRedisScript<List> defaultRedisScript() { DefaultRedisScript<List> defaultRedisScript = new DefaultRedisScript<>(); defaultRedisScript.setResultType(List.class); defaultRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("redis/demo.lua"))); return defaultRedisScript; }
在Spring Boot2.0的時候,上述配置沒有問題,但在Spring
Boot1.5測試會出錯,需要將List.class改為具體的返回類型(如Long.class)。
RedisScript的getSha1()方法可以獲取腳本摘要。
2.調(diào)用腳本
/** * List設(shè)置lua的KEYS */ List<String> keyList = new ArrayList(); keyList.add("count"); keyList.add("rate.limiting:127.0.0.1"); /** *
用Mpa設(shè)置Lua的ARGV[1]
*/ Map<String, Object> argvMap = new HashMap<String, Object>(); argvMap.put("expire", 10000); argvMap.put("times", 10); /** *
調(diào)用腳本并執(zhí)行
*/ List result = redisTemplate1.execute(redisScript, keyList, argvMap); System.out.println(result);
若是出現(xiàn)序列化問題,可以指定序列化方式。
public <T> T execute(RedisScript<T> script, RedisSerializer<?> argsSerializer, RedisSerializer<T> resultSerializer, List<K> keys, Object... args) { return scriptExecutor.execute(script, argsSerializer, resultSerializer, keys, args); }
3.Lua腳本
--獲取KEY local key1 = KEYS[1] local key2 = KEYS[2] --
獲取ARGV[1],這里對應(yīng)到應(yīng)用端是一個List<Map>. -- 注意,這里接收到是的字符串,所以需要用csjon庫解碼成table類型 local
receive_arg_json = cjson.decode(ARGV[1]) --獲取ARGV內(nèi)的參數(shù)并打印 local expire = receive_arg_json.expire local times = receive_arg_json.times
總結(jié)
以上所述是小編給大家介紹的SpringBoot通過RedisTemplate執(zhí)行Lua腳本的方法步驟,希望對大家有所幫助!
- SpringBoot+Redis執(zhí)行l(wèi)ua腳本的5種方式總結(jié)
- 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+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)文章
RocketMQ設(shè)計(jì)之故障規(guī)避機(jī)制
這篇文章主要介紹了RocketMQ設(shè)計(jì)之故障規(guī)避機(jī)制,故障規(guī)避機(jī)制就是用來解決當(dāng)Broker出現(xiàn)故障,Producer不能及時感知而導(dǎo)致消息發(fā)送失敗的問題,下面詳細(xì)介紹需要的小伙伴可以參考一下2022-03-03Java基礎(chǔ)之extends用法詳解及簡單實(shí)例
這篇文章主要介紹了 Java基礎(chǔ)之extends用法詳解及簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02詳解Java8新特性之interface中的static方法和default方法
這篇文章主要介紹了Java8新特性之interface中的static方法和default方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08Java的接口調(diào)用時的權(quán)限驗(yàn)證功能的實(shí)現(xiàn)
這篇文章主要介紹了Java的接口調(diào)用時的權(quán)限驗(yàn)證功能的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11MyBatis開發(fā)Dao層的兩種方式實(shí)現(xiàn)(原始Dao層開發(fā))
這篇文章主要介紹了MyBatis開發(fā)Dao層的兩種方式實(shí)現(xiàn)(原始Dao層開發(fā)),并對數(shù)據(jù)庫進(jìn)行增刪查改,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12