欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

今天有個項目需要使用redis,并且有使用腳本的需求。但是因為之前沒有寫過,所以還有一點點不熟悉,今天記錄一下。

原因:

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

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

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

2、配置redis

因為我是為了測試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腳本

先寫個能方便測試的接口,因為我為了測試lua 的腳本執(zhí)行,所以就沒講什么設(shè)計,直接驗證腳本

這里要做的就是刪除過期的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ù)點

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

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

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

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

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

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

5、調(diào)試方式

調(diào)試lua腳本是真的費勁,因為在redis desktop manage中不太好測試,下面說下怎么測試,如果你本機安裝了redis。

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

2、從命令行啟動redis

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

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

redis-server.exe redis.windows.conf

3、在lua腳本中增加打印

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

4、運行代碼

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

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

6、總結(jié)

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

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

相關(guān)文章

  • Java?List集合取交集的五種常見方式總結(jié)

    Java?List集合取交集的五種常見方式總結(jié)

    在Java中取兩個List集合的交集可以通過多種方式實現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Java?List集合取交集的五種常見方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • 設(shè)計模式之原型模式_動力節(jié)點Java學(xué)院整理

    設(shè)計模式之原型模式_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了設(shè)計模式之原型模式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • mybatis3使用@Select等注解實現(xiàn)增刪改查操作

    mybatis3使用@Select等注解實現(xiàn)增刪改查操作

    這篇文章主要介紹了mybatis3使用@Select等注解實現(xiàn)增刪改查操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • springBoot基于webSocket實現(xiàn)掃碼登錄

    springBoot基于webSocket實現(xiàn)掃碼登錄

    最近做了個新項目,涉及到掃碼登錄。之前項目使用的是 ajax輪詢的方式。感覺太low了。所以這次用webSocket的方式進(jìn)行實現(xiàn),感興趣的可以了解一下
    2021-06-06
  • Java OpenCV圖像處理之背景消除

    Java OpenCV圖像處理之背景消除

    GMM(高斯混合模型)是基于像素樣本統(tǒng)計信息的背景表示方法,利用像素在較長時間內(nèi)大量樣本值的概率密度等統(tǒng)計信息表示別境,然后使用統(tǒng)計差分進(jìn)行目標(biāo)像素判斷達(dá)到預(yù)期效果。本文將利用GMM方法實現(xiàn)圖像背景消除,需要的可以參考一下
    2022-02-02
  • RandomAccessFile簡介_動力節(jié)點Java學(xué)院整理

    RandomAccessFile簡介_動力節(jié)點Java學(xué)院整理

    RandomAccessFile 是隨機訪問文件(包括讀/寫)的類。它支持對文件隨機訪問的讀取和寫入,即我們可以從指定的位置讀取/寫入文件數(shù)據(jù)。這篇文章主要介紹了RandomAccessFile簡介,需要的朋友可以參考下
    2017-05-05
  • java如何獲取指定文件夾下的所有文件名

    java如何獲取指定文件夾下的所有文件名

    這篇文章主要介紹了java如何獲取指定文件夾下的所有文件名問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java后臺如何接收get請求傳過來的數(shù)組

    java后臺如何接收get請求傳過來的數(shù)組

    這篇文章主要介紹了java后臺如何接收get請求傳過來的數(shù)組問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Spring Boot簡介與快速搭建詳細(xì)步驟

    Spring Boot簡介與快速搭建詳細(xì)步驟

    SpringBoot其本身沒有添加什么新的技術(shù),就是整合了一些現(xiàn)有的框架,并提供了一些默認(rèn)的配置,就是這些默認(rèn)的配置,極大的提高了我們的開發(fā)效率。這篇文章主要介紹了Spring Boot簡介與快速搭建,需要的朋友可以參考下
    2021-05-05
  • java時間戳與日期相互轉(zhuǎn)換工具詳解

    java時間戳與日期相互轉(zhuǎn)換工具詳解

    這篇文章主要為大家詳細(xì)介紹了java各種時間戳與日期之間相互轉(zhuǎn)換的工具,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論