springboot使用redisTemplate操作lua腳本
寫(xiě)在前面
操作redis使用Lua腳本有諸多好處
- 減少網(wǎng)絡(luò)開(kāi)銷(xiāo):可以將多個(gè)請(qǐng)求通過(guò)腳本的形式一次發(fā)送,減少網(wǎng)絡(luò)時(shí)延和請(qǐng)求次數(shù)。
- 原子性的操作:Redis會(huì)將整個(gè)腳本作為一個(gè)整體執(zhí)行,中間不會(huì)被其他命令插入。因此在編寫(xiě)腳本的過(guò)程中無(wú)需擔(dān)心會(huì)出現(xiàn)競(jìng)態(tài)條件,無(wú)需使用事務(wù)。
- 代碼復(fù)用:客戶(hù)端發(fā)送的腳步會(huì)永久存在redis中,這樣,其他客戶(hù)端可以復(fù)用這一腳本來(lái)完成相同的邏輯。
- 速度快:見(jiàn) 與其它語(yǔ)言的性能比較, 還有一個(gè) JIT編譯器可以顯著地提高多數(shù)任務(wù)的性能; 對(duì)于那些仍然對(duì)性能不滿(mǎn)意的人, 可以把關(guān)鍵部分使用C實(shí)現(xiàn), 然后與其集成, 這樣還可以享受其它方面的好處。**
- 可以移植:只要是有ANSI C 編譯器的平臺(tái)都可以編譯,你可以看到它可以在幾乎所有的平臺(tái)上運(yùn)行:從 Windows 到Linux,同樣Mac平臺(tái)也沒(méi)問(wèn)題, 再到移動(dòng)平臺(tái)、游戲主機(jī),甚至瀏覽器也可以完美使用 (翻譯成JavaScript)。
- 源碼小巧:20000行C代碼,可以編譯進(jìn)182K的可執(zhí)行文件,加載快,運(yùn)行快。
使用lua
@Test
public void redisLuaTest(){
?? ?String script1 = "if redis.call('setnx', KEYS[1], ARGV[1]) == 1 then redis.call('set', KEYS[2], ARGV[2]) return 1 else return 0 end";
?? ?Long result1 = (Long)redisTemplate.execute(
?? ??? ??? ?new DefaultRedisScript<Long>(script1, Long.class),
?? ??? ??? ?Arrays.asList("key1", "key2"),
?? ??? ??? ?"value1", "value2"
?? ?);
?? ?System.out.println(result1); // 1
?? ?// 如果key1==value1,則刪除key1,返回刪除的狀態(tài),否則返回0
?? ?String script2 = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
?? ?Long result2 = (Long)redisTemplate.execute(
?? ??? ??? ?new DefaultRedisScript<Long>(script2, Long.class),
?? ??? ??? ?Arrays.asList("key1"),
?? ??? ??? ?"value1"
?? ?);
?? ?System.out.println(result2); // 1
}解釋
/**
第一個(gè)參數(shù)使用默認(rèn)的DefaultRedisScript即可;
List<K> keys是key的集合
Object... args是val的集合
*/
@Override
public <T> T execute(RedisScript<T> script, List<K> keys, Object... args) {
return scriptExecutor.execute(script, keys, args);
}
key的集合,在lua中可以使用KEYS[1]、KEYS[2]……獲取,注意KEYS必須大寫(xiě)不能拼錯(cuò);
val的集合,在lua中可以使用ARGV[1]、ARGV[2]……獲取,注意ARGV必須大寫(xiě)不能拼錯(cuò)。
說(shuō)白了,使用redisTemplate操作lua,也就是傳key的集合和val的集合,這一串lua腳本可以保證其原子性的。
具體lua語(yǔ)法其實(shí)也很簡(jiǎn)單,基本掌握了if else、循環(huán)、賦值語(yǔ)句,就能應(yīng)付大部分操作redis的命令。
lua中的redis.call命令就是操作redis的命令,第一個(gè)參數(shù)就是redis的原始命令,后面的參數(shù)就是redis命令的參數(shù),使用起來(lái)也非常方便。
到此這篇關(guān)于springboot使用redisTemplate操作lua腳本的文章就介紹到這了,更多相關(guān)springboot redisTemplate操作lua內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot+Redis執(zhí)行l(wèi)ua腳本的5種方式總結(jié)
- Springboot+Redis執(zhí)行l(wèi)ua腳本的項(xiàng)目實(shí)踐
- springboot中使用redis并且執(zhí)行調(diào)試lua腳本
- SpringBoot通過(guò)redisTemplate調(diào)用lua腳本并打印調(diào)試信息到redis log(方法步驟詳解)
- SpringBoot通過(guò)RedisTemplate執(zhí)行Lua腳本的方法步驟
- 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)文章
在Eclipse安裝Spring boot插件的步驟(圖文)
這篇文章主要介紹了在Eclipse安裝Spring boot插件的步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
簡(jiǎn)單了解Mybatis如何實(shí)現(xiàn)SQL防注入
這篇文章主要介紹了簡(jiǎn)單了解Mybatis如何實(shí)現(xiàn)SQL防注入,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Freemaker Replace函數(shù)的正則表達(dá)式運(yùn)用
這篇文章主要介紹了Freemaker Replace函數(shù)的正則表達(dá)式運(yùn)用 的相關(guān)資料,需要的朋友可以參考下2015-12-12
spring boot Rabbit高級(jí)教程(最新推薦)
RabbitMQ的消息過(guò)期是基于追溯方式來(lái)實(shí)現(xiàn)的,也就是說(shuō)當(dāng)一個(gè)消息的TTL到期以后不一定會(huì)被移除或投遞到死信交換機(jī),而是在消息恰好處于隊(duì)首時(shí)才會(huì)被處理,本篇文章給大家介紹spring boot Rabbit高級(jí)教程,感興趣的朋友一起看看吧2023-10-10
RabbitMq中channel接口的幾種常用參數(shù)詳解
這篇文章主要介紹了RabbitMq中channel接口的幾種常用參數(shù)詳解,RabbitMQ 不會(huì)為未確認(rèn)的消息設(shè)置過(guò)期時(shí)間,它判斷此消息是否需要重新投遞給消費(fèi)者的唯一依據(jù)是消費(fèi)該消息的消費(fèi)者連接是否己經(jīng)斷開(kāi),需要的朋友可以參考下2023-08-08

