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

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

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

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

原因:

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

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

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

2、配置redis

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

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

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

3、測試redis 的lua腳本

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

這里要做的就是刪除過期的key,同時移除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);//返回類型是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";
    }
}

再來看下lua腳本,這東西花了我不少的時間

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 傳參可以有兩個全局變量,一個KEYS,一個是ARGV

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

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

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

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

6、lua 會阻塞線程,如果腳本太耗時會卡主服務(wù)器

5、調(diào)試方式

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

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

2、從命令行啟動redis

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

打開命令行,輸入下面的命令就能啟動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ù)啟動redis就好了

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

6、總結(jié)

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

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

相關(guān)文章

最新評論

嵩明县| 都江堰市| 卓资县| 东平县| 兴化市| 天柱县| 甘泉县| 昂仁县| 武穴市| 东阳市| 什邡市| 抚松县| 西宁市| 宁津县| 离岛区| 衡东县| 常州市| 清镇市| 科尔| 远安县| 江都市| 嘉峪关市| 卫辉市| 贵南县| 大安市| 吉林省| 达州市| 商南县| 额济纳旗| 汕尾市| 广河县| 大连市| 循化| 伊金霍洛旗| 上思县| 格尔木市| 宜兴市| 宁远县| 南川市| 茂名市| 大渡口区|