springboot使用redisTemplate操作lua腳本
寫在前面
操作redis使用Lua腳本有諸多好處
- 減少網(wǎng)絡(luò)開銷:可以將多個請求通過腳本的形式一次發(fā)送,減少網(wǎng)絡(luò)時延和請求次數(shù)。
- 原子性的操作:Redis會將整個腳本作為一個整體執(zhí)行,中間不會被其他命令插入。因此在編寫腳本的過程中無需擔(dān)心會出現(xiàn)競態(tài)條件,無需使用事務(wù)。
- 代碼復(fù)用:客戶端發(fā)送的腳步會永久存在redis中,這樣,其他客戶端可以復(fù)用這一腳本來完成相同的邏輯。
- 速度快:見 與其它語言的性能比較, 還有一個 JIT編譯器可以顯著地提高多數(shù)任務(wù)的性能; 對于那些仍然對性能不滿意的人, 可以把關(guān)鍵部分使用C實現(xiàn), 然后與其集成, 這樣還可以享受其它方面的好處。**
- 可以移植:只要是有ANSI C 編譯器的平臺都可以編譯,你可以看到它可以在幾乎所有的平臺上運(yùn)行:從 Windows 到Linux,同樣Mac平臺也沒問題, 再到移動平臺、游戲主機(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
}解釋
/**
第一個參數(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必須大寫不能拼錯;
val的集合,在lua中可以使用ARGV[1]、ARGV[2]……獲取,注意ARGV必須大寫不能拼錯。
說白了,使用redisTemplate操作lua,也就是傳key的集合和val的集合,這一串lua腳本可以保證其原子性的。
具體lua語法其實也很簡單,基本掌握了if else、循環(huán)、賦值語句,就能應(yīng)付大部分操作redis的命令。
lua中的redis.call命令就是操作redis的命令,第一個參數(shù)就是redis的原始命令,后面的參數(shù)就是redis命令的參數(shù),使用起來也非常方便。
到此這篇關(guān)于springboot使用redisTemplate操作lua腳本的文章就介紹到這了,更多相關(guān)springboot redisTemplate操作lua內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot+Redis執(zhí)行l(wèi)ua腳本的5種方式總結(jié)
- Springboot+Redis執(zhí)行l(wèi)ua腳本的項目實踐
- 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利用注解來實現(xiàn)Redis分布式鎖
- SpringBoot基于Redis的分布式鎖實現(xiàn)過程記錄
- 關(guān)于SpringBoot 使用 Redis 分布式鎖解決并發(fā)問題
- springboot+redis+lua實現(xiàn)分布式鎖的腳本
相關(guān)文章
在Eclipse安裝Spring boot插件的步驟(圖文)
這篇文章主要介紹了在Eclipse安裝Spring boot插件的步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Freemaker Replace函數(shù)的正則表達(dá)式運(yùn)用
這篇文章主要介紹了Freemaker Replace函數(shù)的正則表達(dá)式運(yùn)用 的相關(guān)資料,需要的朋友可以參考下2015-12-12
RabbitMq中channel接口的幾種常用參數(shù)詳解
這篇文章主要介紹了RabbitMq中channel接口的幾種常用參數(shù)詳解,RabbitMQ 不會為未確認(rèn)的消息設(shè)置過期時間,它判斷此消息是否需要重新投遞給消費(fèi)者的唯一依據(jù)是消費(fèi)該消息的消費(fèi)者連接是否己經(jīng)斷開,需要的朋友可以參考下2023-08-08

