SpringBoot使用Lua操作Redis

本文介紹SpringBoot如果通過Lua腳本去執(zhí)行Redis,介紹簡單用法例子逗威,如對Lua腳本還不了解的可以先參考我這邊文章Lua腳本快速入門署穗,更深層次的用法請參考Redis官網(wǎng)

1. 添加依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
     <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. 編寫Lua腳本

---
--- Created by Gjing.
--- DateTime: 2019/6/21 10:49
---
--- 獲取key
local key = KEYS[1]
--- 獲取value
local val = KEYS[2]
--- 獲取一個參數(shù)
local expire = ARGV[1]
--- 如果redis找不到這個key就去插入
if redis.call("get", key) == false then
    --- 如果插入成功,就去設(shè)置過期值
    if redis.call("set", key, val) then
        --- 由于lua腳本接收到參數(shù)都會轉(zhuǎn)為String哈垢,所以要轉(zhuǎn)成數(shù)字類型才能比較
        if tonumber(expire) > 0 then
            --- 設(shè)置過期時間
            redis.call("expire", key, expire)
        end
        return true
    end
    return false
else
    return false
end

3. 編寫配置

/**
 * @author Gjing
 **/
@Configuration
public class LuaConfiguration {
    @Bean
    public DefaultRedisScript<Boolean> redisScript() {
        DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>();
        redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("script/Test.lua")));
        redisScript.setResultType(Boolean.class);
        return redisScript;
    }
}

4. 調(diào)用測試

/**
 * @author Gjing
 **/
@RestController
public class LockController {
    @Resource
    private DefaultRedisScript<Boolean> redisScript;
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @GetMapping("/lua")
    public ResponseEntity lua() {
        List<String> keys = Arrays.asList("testLua", "hello lua");
        Boolean execute = stringRedisTemplate.execute(redisScript, keys, "100");
        assert execute != null;
        return ResponseEntity.ok(execute);
    }
}

5. 返回結(jié)果

  • 執(zhí)行成功控制臺輸出

    1.jpg

  • 執(zhí)行失敗控制臺輸出

    2.jpg

  • Redis中內(nèi)容

    3.jpg

6. Redis使用Lua的好處

1.減少網(wǎng)絡(luò)開銷:本來5次網(wǎng)絡(luò)請求的操作,可以用一個請求完成扛拨,原先5次請求的邏輯放在redis服務(wù)器上完成耘分。使用腳本,減少了網(wǎng)絡(luò)往返時延绑警。

2.原子操作:Redis會將整個腳本作為一個整體執(zhí)行求泰,中間不會被其他命令插入。

3.復(fù)用:客戶端發(fā)送的腳本會永久存儲在Redis中计盒,意味著其他客戶端可以復(fù)用這一腳本而不需要使用代碼完成同樣的邏輯渴频。

7. Redis使用Lua的注意點

1.Lua腳本的bug特別可怕,由于Redis的單線程特點北启,一旦Lua腳本出現(xiàn)不會返回(不是返回值)得問題卜朗,那么這個腳本就會阻塞整個redis實例。

2.Lua腳本應(yīng)該盡量短小實現(xiàn)關(guān)鍵步驟即可咕村。(原因同上)

3.Lua腳本中不應(yīng)該出現(xiàn)常量Key场钉,這樣會導(dǎo)致每次執(zhí)行時都會在腳本字典中新建一個條目,應(yīng)該使用全局變量數(shù)組KEYS和ARGV, KEYS和ARGV的索引都從1開始

4.傳遞給lua腳本的的鍵和參數(shù):傳遞給lua腳本的鍵列表應(yīng)該包括可能會讀取或者寫入的所有鍵懈涛。傳入全部的鍵使得在使用各種分片或者集群技術(shù)時逛万,其他軟件可以在應(yīng)用層檢查所有的數(shù)據(jù)是不是都在同一個分片里面。另外集群版redis也會對將要訪問的key進行檢查批钠,如果不在同一個服務(wù)器里面宇植,那么redis將會返回一個錯誤得封。(決定使用集群版之前應(yīng)該考慮業(yè)務(wù)拆分),參數(shù)列表無所謂当纱。呛每。

5.lua腳本跟單個redis命令和事務(wù)段一樣都是原子的已經(jīng)進行了數(shù)據(jù)寫入的lua腳本將無法中斷,只能使用SHUTDOWN NOSAVE殺死Redis服務(wù)器坡氯,所以lua腳本一定要測試好晨横。


以上為個人理解,如有誤歡迎各位指正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末箫柳,一起剝皮案震驚了整個濱河市手形,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悯恍,老刑警劉巖库糠,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涮毫,居然都是意外死亡瞬欧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門罢防,熙熙樓的掌柜王于貴愁眉苦臉地迎上來艘虎,“玉大人,你說我怎么就攤上這事咒吐∫敖ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵恬叹,是天一觀的道長候生。 經(jīng)常有香客問我,道長绽昼,這世上最難降的妖魔是什么唯鸭? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮硅确,結(jié)果婚禮上肿孵,老公的妹妹穿的比我還像新娘。我一直安慰自己疏魏,他們只是感情好停做,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著大莫,像睡著了一般蛉腌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天烙丛,我揣著相機與錄音舅巷,去河邊找鬼。 笑死河咽,一個胖子當(dāng)著我的面吹牛钠右,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忘蟹,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼飒房,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了媚值?” 一聲冷哼從身側(cè)響起狠毯,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎褥芒,沒想到半個月后嚼松,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡锰扶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年献酗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坷牛。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡罕偎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漓帅,到底是詐尸還是另有隱情锨亏,我是刑警寧澤痴怨,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布忙干,位于F島的核電站,受9級特大地震影響浪藻,放射性物質(zhì)發(fā)生泄漏捐迫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一爱葵、第九天 我趴在偏房一處隱蔽的房頂上張望施戴。 院中可真熱鬧,春花似錦萌丈、人聲如沸赞哗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肪笋。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間藤乙,已是汗流浹背猜揪。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坛梁,地道東北人而姐。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像划咐,于是被迫代替她去往敵國和親拴念。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353