SpringBoot通過(guò)RedisTemplate執(zhí)行Lua腳本的方法步驟
lua 腳本
Redis 中使用 lua 腳本,我們需要注意的是,從 Redis 2.6.0后才支持 lua 腳本的執(zhí)行。
使用 lua 腳本的好處:
原子操作:lua腳本是作為一個(gè)整體執(zhí)行的,所以中間不會(huì)被其他命令插入。
減少網(wǎng)絡(luò)開(kāi)銷:可以將多個(gè)請(qǐng)求通過(guò)腳本的形式一次發(fā)送,減少網(wǎng)絡(luò)時(shí)延。
復(fù)用性:lua腳本可以常駐在redis內(nèi)存中,所以在使用的時(shí)候,可以直接拿來(lá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的時(shí)候,上述配置沒(méi)有問(wèn)題,但在Spring
Boot1.5測(cè)試會(huì)出錯(cuò),需要將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)序列化問(wè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],這里對(duì)應(yīng)到應(yīng)用端是一個(gè)List<Map>. -- 注意,這里接收到是的字符串,所以需要用csjon庫(kù)解碼成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通過(guò)RedisTemplate執(zhí)行Lua腳本的方法步驟,希望對(duì)大家有所幫助!
- 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通過(guò)redisTemplate調(diào)用lua腳本并打印調(diào)試信息到redis log(方法步驟詳解)
- SpringBoot+Redis執(zhí)行l(wèi)ua腳本的方法步驟
- SpringBoot利用注解來(lái)實(shí)現(xiàn)Redis分布式鎖
- SpringBoot基于Redis的分布式鎖實(shí)現(xiàn)過(guò)程記錄
- 關(guān)于SpringBoot 使用 Redis 分布式鎖解決并發(fā)問(wèn)題
- springboot+redis+lua實(shí)現(xiàn)分布式鎖的腳本
相關(guān)文章
RocketMQ存儲(chǔ)文件的實(shí)現(xiàn)
這篇文章主要介紹了RocketMQ存儲(chǔ)文件的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07RocketMQ設(shè)計(jì)之故障規(guī)避機(jī)制
這篇文章主要介紹了RocketMQ設(shè)計(jì)之故障規(guī)避機(jī)制,故障規(guī)避機(jī)制就是用來(lái)解決當(dāng)Broker出現(xiàn)故障,Producer不能及時(shí)感知而導(dǎo)致消息發(fā)送失敗的問(wèn)題,下面詳細(xì)介紹需要的小伙伴可以參考一下2022-03-03Java基礎(chǔ)之extends用法詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了 Java基礎(chǔ)之extends用法詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02詳解Java8新特性之interface中的static方法和default方法
這篇文章主要介紹了Java8新特性之interface中的static方法和default方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08Java的接口調(diào)用時(shí)的權(quán)限驗(yàn)證功能的實(shí)現(xiàn)
這篇文章主要介紹了Java的接口調(diào)用時(shí)的權(quán)限驗(yàn)證功能的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Java運(yùn)算符從見(jiàn)過(guò)到掌握上
計(jì)算機(jī)的最基本用途之一就是執(zhí)行數(shù)學(xué)運(yùn)算,作為一門計(jì)算機(jī)語(yǔ)言,Java也提供了一套豐富的運(yùn)算符來(lái)操縱變量,本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下2021-09-09MyBatis開(kāi)發(fā)Dao層的兩種方式實(shí)現(xiàn)(原始Dao層開(kāi)發(fā))
這篇文章主要介紹了MyBatis開(kāi)發(fā)Dao層的兩種方式實(shí)現(xiàn)(原始Dao層開(kāi)發(fā)),并對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪查改,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12