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 編譯器的平臺都可以編譯,你可以看到它可以在幾乎所有的平臺上運行:從 Windows 到Linux,同樣Mac平臺也沒問題, 再到移動平臺、游戲主機,甚至瀏覽器也可以完美使用 (翻譯成JavaScript)。
- 源碼小巧:20000行C代碼,可以編譯進182K的可執(zhí)行文件,加載快,運行快。
使用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)文章
基于Cookie與Session的Servlet?API會話管理操作
這篇文章主要為大家介紹了基于Cookie與Session的Servlet?API會話管理操作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08java四種引用及在LeakCanery中應(yīng)用詳解
這篇文章主要介紹了java四種引用及在LeakCanery中應(yīng)用,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09監(jiān)控Spring Boot 項目運行情況操作方法
在實際開發(fā)中,經(jīng)常會遇到想要獲取到服務(wù)器應(yīng)用的運行情況的場景,在微服務(wù)架構(gòu)下對于每個應(yīng)用運行情況的監(jiān)控是保證系統(tǒng)高可用的關(guān)鍵,本文給大家介紹如何實現(xiàn)在Spring Boot的jar包中對系統(tǒng)的運行情況進行監(jiān)控操作,感興趣的朋友跟隨小編一起看看吧2024-08-08快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的解決
這篇文章主要介紹了快速校驗實體類時,@Valid,@Validated,@NotNull注解無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10SpringMVC中常用參數(shù)校驗類注解使用示例教程
這篇文章主要介紹了SpringMVC中常用參數(shù)校驗類注解使用示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03