溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

怎么在SpringBoot中利用RedisTemplate執(zhí)行Lua腳本

發(fā)布時(shí)間:2021-05-19 16:21:19 來(lái)源:億速云 閱讀:393 作者:Leah 欄目:編程語(yǔ)言

本篇文章為大家展示了怎么在SpringBoot中利用RedisTemplate執(zhí)行Lua腳本,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

lua 腳本

Redis 中使用 lua 腳本,我們需要注意的是,從 Redis 2.6.0后才支持 lua 腳本的執(zhí)行。

使用 lua 腳本的好處:

原子操作:lua腳本是作為一個(gè)整體執(zhí)行的,所以中間不會(huì)被其他命令插入。
減少網(wǎng)絡(luò)開(kāi)銷(xiāo):可以將多個(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依賴(lài),其次把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改為具體的返回類(lèi)型(如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類(lèi)型 local

receive_arg_json = cjson.decode(ARGV[1]) --獲取ARGV內(nèi)的參數(shù)并打印 local expire = 
receive_arg_json.expire local times = receive_arg_json.times

springboot是什么

springboot一種全新的編程規(guī)范,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程,SpringBoot也是一個(gè)服務(wù)于框架的框架,服務(wù)范圍是簡(jiǎn)化配置文件。

上述內(nèi)容就是怎么在SpringBoot中利用RedisTemplate執(zhí)行Lua腳本,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI