最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot中使用redis并且執(zhí)行調(diào)試lua腳本

 更新時(shí)間:2022年04月25日 10:22:44   作者:香菜_香菜  
今天有個(gè)項(xiàng)目需要使用redis,并且有使用腳本的需求,本文主要介紹了springboot中使用redis并且執(zhí)行調(diào)試lua腳本,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

今天有個(gè)項(xiàng)目需要使用redis,并且有使用腳本的需求。但是因?yàn)橹皼](méi)有寫(xiě)過(guò),所以還有一點(diǎn)點(diǎn)不熟悉,今天記錄一下。

原因:

原子操作,redis會(huì)將整個(gè)腳本作為一個(gè)整體執(zhí)行,中間不會(huì)被其他命令插入。

1、創(chuàng)建一個(gè)基本的web項(xiàng)目

文件 ->新建 -> 項(xiàng)目,選擇spring initializr ,勾選spring web 方便測(cè)試,最主要勾選 spring data redis,和下圖一樣

2、配置redis

因?yàn)槲沂菫榱藴y(cè)試redis,所以直接使用的本地的redis,你可以替換成application.yaml,或者使用環(huán)境變量替換。

#Redis服務(wù)器ip
spring.redis.host=127.0.0.1
#Redis服務(wù)器連接端口
spring.redis.port=6379

注: 你不配置的話(huà)默認(rèn)值就是上面的

3、測(cè)試redis 的lua腳本

先寫(xiě)個(gè)能方便測(cè)試的接口,因?yàn)槲覟榱藴y(cè)試lua 的腳本執(zhí)行,所以就沒(méi)講什么設(shè)計(jì),直接驗(yàn)證腳本

這里要做的就是刪除過(guò)期的key,同時(shí)移除hash中的key

package com.pdool.main;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.scripting.support.ResourceScriptSource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.*;
import java.util.stream.Collectors;
 
@RestController
public class TestController {
    @Autowired
    private StringRedisTemplate redisTemplate;
 
    @RequestMapping("test")
    public String test() {
        System.out.println("xxxxxxxxxxxxxx");
        try {
            //調(diào)用lua腳本并執(zhí)行
            DefaultRedisScript<Void> redisScript = new DefaultRedisScript<>();
            redisScript.setResultType(Void.class);//返回類(lèi)型是Long
            //lua文件存放在resources目錄下的redis文件夾內(nèi)
            Set<String> webApiRequestSet = new HashSet<>();
            webApiRequestSet.add("aa");
            webApiRequestSet.add("bb");
 
            Set<String> webWebsocketRequestSet = new HashSet<>();
 
            String shortHashKey = "abc";
            String longHashKey = "def";
            String delShortKeys = webApiRequestSet.stream().map((requestId) -> shortHashKey + ":" + requestId).collect(Collectors.joining(";"));
            String delLongKeys = webWebsocketRequestSet.stream().map((requestId) -> longHashKey + ":" + requestId).collect(Collectors.joining(";"));
            List<String> keys = Arrays.asList(shortHashKey, longHashKey);
 
            redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("redis/clear-local-key.lua")));
            redisTemplate.execute(redisScript, keys, delShortKeys, delLongKeys);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "sssssssss";
    }
}

再來(lái)看下lua腳本,這東西花了我不少的時(shí)間

local short_hash_key = KEYS[1];
local long_hash_key = KEYS[2];
local del_short_hash_keys = ARGV[1];
local del_long_hash_keys = ARGV[2];
 
local function tt_split(str,reps )
          local resultStrList = {}
          string.gsub(str,'[^'..reps..']+',function ( w )
              table.insert(resultStrList,w)
          end)
          return resultStrList
      end
local del_short_key_list= tt_split(del_short_hash_keys,";")
for i = 1, #del_short_key_list do
    local del_key = del_short_key_list[i];
    redis.call("DEL", del_key)
    redis.call("HDEL", short_hash_key, del_key)
end
 
local del_long_key_list = tt_split(del_long_hash_keys,";")
for i = 1, #del_long_key_list do
    local del_key = del_long_key_list[i];
    redis.call("DEL", del_key)
    redis.call("HDEL", long_hash_key, del_key)
end

4、技術(shù)點(diǎn)

1、redis 傳參可以有兩個(gè)全局變量,一個(gè)KEYS,一個(gè)是ARGV

2、redis執(zhí)行的lua 不可以有全局變量,因?yàn)闀?huì)污染環(huán)境,所以這里的function 是local

3、lua沒(méi)有線(xiàn)程的字符串拆分函數(shù),上面的函數(shù)是我找些unity的同學(xué)從項(xiàng)目中扒出來(lái)的

4、lua 列表的下標(biāo)從1 開(kāi)始的

5、redis中執(zhí)行的lua 是 事務(wù)性的

6、lua 會(huì)阻塞線(xiàn)程,如果腳本太耗時(shí)會(huì)卡主服務(wù)器

5、調(diào)試方式

調(diào)試lua腳本是真的費(fèi)勁,因?yàn)樵趓edis desktop manage中不太好測(cè)試,下面說(shuō)下怎么測(cè)試,如果你本機(jī)安裝了redis。

1、進(jìn)入服務(wù)關(guān)閉關(guān)閉正在運(yùn)行的服務(wù)器

2、從命令行啟動(dòng)redis

找到redis 在本機(jī)的安裝路徑,我的路徑是 C:\Program Files\Redis

打開(kāi)命令行,輸入下面的命令就能啟動(dòng)redis服務(wù)器了

redis-server.exe redis.windows.conf

3、在lua腳本中增加打印

redis.log(redis.LOG_WARNING, "last_tokens " .. last_tokens)

4、運(yùn)行代碼

調(diào)用lua腳本,就可以看到下面的輸出了,如果你不想看了,就直接從服務(wù)啟動(dòng)redis就好了

注意:正式應(yīng)用的時(shí)候把log 注釋掉。

6、總結(jié)

今天主要的時(shí)間耗費(fèi)在lua 函數(shù)的定義,一直沒(méi)有搞懂怎么調(diào)用,點(diǎn)有背,碰了好多次都沒(méi)成功。

到此這篇關(guān)于springboot中使用redis并且執(zhí)行調(diào)試lua腳本的文章就介紹到這了,更多相關(guān)springboot使用redis執(zhí)行調(diào)試lua內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

佳木斯市| 通辽市| 资中县| 长沙市| 宜兰市| 确山县| 东方市| 长泰县| 莱芜市| 宜川县| 淮安市| 黎城县| 金沙县| 旌德县| 什邡市| 呼玛县| 璧山县| 商南县| 铜山县| 昌邑市| 修武县| 周至县| 河津市| 灵宝市| 论坛| 山阴县| 玉溪市| 临汾市| 镶黄旗| 安丘市| 临猗县| 安化县| 平远县| 凤城市| 栾城县| 台南县| 宜君县| 杭锦后旗| 金坛市| 罗甸县| 枣阳市|