亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

springboot lua檢查redis庫存的實現(xiàn)示例

 更新時間:2024年09月12日 10:06:18   作者:morganEngineer  
本文主要介紹了springboot lua檢查redis庫存的實現(xiàn)示例,為了優(yōu)化性能,通過Lua腳本實現(xiàn)對多個馬戲場次下的座位等席的庫存余量檢查,感興趣的可以了解一下

需求

最近需求需要實現(xiàn)檢查多個馬戲場次下的座位等席對應(yīng)庫存渠道的庫存余量,考慮到性能,決定采用Lua腳本實現(xiàn)庫存檢查。

數(shù)據(jù)結(jié)構(gòu)

庫存層級結(jié)構(gòu)

在這里插入圖片描述

redis庫存hash類型結(jié)構(gòu)

在這里插入圖片描述

實現(xiàn)

lua腳本

--- 字符串分割為數(shù)組
local function split(str, char)
    local arr = {};
    local pattern = string.format('([^%s]+)', char);
    for item in string.gmatch(str, pattern) do
        table.insert(arr, item);
    end
    return arr;
end
--- 數(shù)組轉(zhuǎn)成map
local function toMap(tb)
    if (tb == nil) then
        return {};
    end
    local map = {};
    for i = 1, #tb do
        if (i % 2 == 1) then
            map[tb[i]] = tb[i+1];
        end
    end
    return map;
end
--- 初始化數(shù)據(jù),入?yún)?1:1,02:2.01:3
local argArr = {};
for rowItem in string.gmatch(ARGV[1], '([^.]+)') do
    local row = {};
    for keyVal in string.gmatch(rowItem, '([^,]+)') do
    -- 解析出每個key與value
        local tempArr = split(keyVal, ':');
        row[tempArr[1]] = tempArr[2];
    end
    table.insert(argArr, row);
end
--- 檢查庫存
for i = 1, #KEYS do
    --local rData = redis.call("HMGET", KEYS[i], '01 02');
    local rdsMap = toMap(redis.call("HGETALL", KEYS[i]));
    for tier, quantity in pairs(argArr[i]) do
        --redis.log(redis.LOG_NOTICE, string.format('key is:%s,tier is:%s,quantity is:%s', KEYS[i], tier, quantity));
        if (rdsMap[tier] == nil or tonumber(quantity) > tonumber(rdsMap[tier])) then
            return string.format("庫存key:%s,tier:%s不足", KEYS[i], tier);
        end
    end
end
return '';

遍歷鍵值對時需要使用pairs而不是ipairs,二者區(qū)別如下:
for k,v in pairs(argArr)的遍歷順序并非是table類型數(shù)據(jù)的排列順序,而是根據(jù)table中key的hash值排列的順序來遍歷的。
for k,v in ipairs(argArr)必須要求table中的key為有序的,而且必須是從1開始,ipairs只會從1開始按連續(xù)的key順序遍歷到key不連續(xù)為止。

  • 入?yún)⒃O(shè)計
    由于RedisTemplate直接傳入集合為參數(shù)序列化后會有中括號,而lua腳本table類型使用花括號定義,因此采用字符串作為入?yún)?,在lua腳本中解析字符串為table類型。例如參數(shù)01:1,02:2.01:3代表二維數(shù)組,第一行為01:1,02:2,其中01為渠道,1為渠道對應(yīng)的庫存,英文逗號作為渠道分隔符。
  • springboot調(diào)用lua腳本
@Autowired
private StringRedisTemplate redisJsonTemplate;

@Test
public void checkInventory() {
    List<String> keyList = List.of("stock:GZ7:433680411156197407", "stock:GZ7:433680411156197408");
    // 執(zhí)行 lua 腳本
    DefaultRedisScript<String> redisScript = new DefaultRedisScript<>();
    // 指定 lua 腳本
    redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("/lua/TheaterStockCheck.lua")));
    // 指定返回類型
    redisScript.setResultType(String.class);
    Object result = redisJsonTemplate.execute(redisScript, keyList, "01:1,0101:2.01:3");
    //01:1,02:2.01:3
    System.out.println(result);
}

調(diào)用lua腳本需要使用string序列化方式,使用jdk序列化方式會導致序列化后的數(shù)據(jù)lua腳本無法解析

測試效果

redis庫存數(shù)據(jù)

在這里插入圖片描述

調(diào)用效果

在這里插入圖片描述

到此這篇關(guān)于springboot lua檢查redis庫存的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)springboot lua檢查redis庫存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Java異常處理與throws關(guān)鍵字用法分析

    Java異常處理與throws關(guān)鍵字用法分析

    這篇文章主要介紹了Java異常處理與throws關(guān)鍵字用法,結(jié)合實例形式分析了java常見的異常、錯誤處理及throws關(guān)鍵字相關(guān)使用技巧、注意事項,需要的朋友可以參考下
    2019-01-01
  • BaseJDBC和CRUDDAO的寫法實例代碼

    BaseJDBC和CRUDDAO的寫法實例代碼

    這篇文章主要介紹了BaseJDBC和CRUDDAO的寫法實例代碼,代碼注釋十分詳細,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • SpringBoot整合EasyCaptcha實現(xiàn)圖形驗證碼功能

    SpringBoot整合EasyCaptcha實現(xiàn)圖形驗證碼功能

    這篇文章主要介紹了SpringBoot整合EasyCaptcha實現(xiàn)圖形驗證碼功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-02-02
  • Java中的MapStruct知識點總結(jié)

    Java中的MapStruct知識點總結(jié)

    這篇文章主要介紹了Java中的MapStruct知識點總結(jié),MapStruct是一個Java注解處理器,用于生成類型安全的映射代碼,它可以自動處理源對象和目標對象之間的映射,減少了手動編寫重復的映射代碼的工作量,需要的朋友可以參考下
    2023-10-10
  • 基于spring?data?jpa?@query返回map的踩坑記錄

    基于spring?data?jpa?@query返回map的踩坑記錄

    這篇文章主要介紹了基于spring?data?jpa?@query返回map的踩坑記錄,具有很好的參考價值,如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring Boot的應(yīng)用啟動與關(guān)閉的方法

    Spring Boot的應(yīng)用啟動與關(guān)閉的方法

    本篇文章主要介紹了Spring Boot的應(yīng)用啟動與關(guān)閉的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Spring Boot整合Spring Data Jpa代碼實例

    Spring Boot整合Spring Data Jpa代碼實例

    這篇文章主要介紹了Spring Boot整合Spring Data Jpa代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • idea?compile項目正常啟動項目的時候build失敗報“找不到符號”等問題及解決方案

    idea?compile項目正常啟動項目的時候build失敗報“找不到符號”等問題及解決方案

    這篇文章主要介紹了idea?compile項目正常,啟動項目的時候build失敗,報“找不到符號”等問題,這種問題屬于lombok編譯失敗導致,可能原因是依賴jar包沒有更新到最新版本,需要的朋友可以參考下
    2023-10-10
  • 簡要分析Java多進程編程的并發(fā)控制

    簡要分析Java多進程編程的并發(fā)控制

    這篇文章介紹了簡要分析Java多進程編程的并發(fā)控制,主要針對內(nèi)存獲取方面,需要的朋友可以參考下
    2015-11-11
  • SpringBoot整合Drools的實現(xiàn)步驟

    SpringBoot整合Drools的實現(xiàn)步驟

    Drools是一個易于訪問企業(yè)策略、易于調(diào)整以及易于管理的開源業(yè)務(wù)規(guī)則引擎,符合業(yè)內(nèi)標準,速度快、效率高。業(yè)務(wù)分析師或?qū)徍巳藛T可以利用它輕松查看業(yè)務(wù)規(guī)則,從而檢驗是否已編碼的規(guī)則執(zhí)行所需的業(yè)務(wù)規(guī)則。本文將講述SpringBoot整合Drools的步驟
    2021-05-05

最新評論