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)文章
基于Cookie與Session的Servlet?API會(huì)話(huà)管理操作
這篇文章主要為大家介紹了基于Cookie與Session的Servlet?API會(huì)話(huà)管理操作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08如何實(shí)用Java實(shí)現(xiàn)合并、拆分PDF文檔
這篇文章主要介紹了如何實(shí)用Java實(shí)現(xiàn)合并、拆分PDF文檔,處理PDF文檔時(shí),這樣的好處是對(duì)文檔的存儲(chǔ)、管理很方便。下面將通過(guò)Java程序代碼介紹具體的PDF合并、拆分的方法,需要的朋友可以參考下2019-07-07java四種引用及在LeakCanery中應(yīng)用詳解
這篇文章主要介紹了java四種引用及在LeakCanery中應(yīng)用,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09SpringBoot MyBatis簡(jiǎn)單快速入門(mén)例子
MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。這篇文章主要介紹了SpringBoot MyBatis快速入門(mén)-簡(jiǎn)單例子,需要的朋友可以參考下2021-07-07監(jiān)控Spring Boot 項(xiàng)目運(yùn)行情況操作方法
在實(shí)際開(kāi)發(fā)中,經(jīng)常會(huì)遇到想要獲取到服務(wù)器應(yīng)用的運(yùn)行情況的場(chǎng)景,在微服務(wù)架構(gòu)下對(duì)于每個(gè)應(yīng)用運(yùn)行情況的監(jiān)控是保證系統(tǒng)高可用的關(guān)鍵,本文給大家介紹如何實(shí)現(xiàn)在Spring Boot的jar包中對(duì)系統(tǒng)的運(yùn)行情況進(jìn)行監(jiān)控操作,感興趣的朋友跟隨小編一起看看吧2024-08-08快速校驗(yàn)實(shí)體類(lèi)時(shí),@Valid,@Validated,@NotNull注解無(wú)效的解決
這篇文章主要介紹了快速校驗(yàn)實(shí)體類(lèi)時(shí),@Valid,@Validated,@NotNull注解無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10SpringMVC中常用參數(shù)校驗(yàn)類(lèi)注解使用示例教程
這篇文章主要介紹了SpringMVC中常用參數(shù)校驗(yàn)類(lèi)注解使用示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03