Lua脚本之库存

复制代码
@SpringBootTest
public class MyluaTest {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Resource(name = "redisTemplate")
    private ValueOperations valueOperations;

    @Test
    void test() {
        valueOperations.set("pi1", 14);
        valueOperations.set("pi2", 11);
        valueOperations.set("pi3", 6);
    }

    @Test
    void test1() {
        ArrayList<MyProduct> myProDucts1 = CollUtil.newArrayList(new MyProduct().setProductId("pi1").setQty(14),
                new MyProduct().setProductId("pi2").setQty(11),
                new MyProduct().setProductId("pi3").setQty(6)
        );
        StringBuilder sb = new StringBuilder();
        //查看商品id的库存实际数量
        sb.append(" local redisQtys = redis.call('mget',unpack(KEYS)) ");
        sb.append(" local myTable = {} ");
        sb.append(" for i = 1, #KEYS  do ");
        //判断若需求量大于库存量,把商品id和库存量放入myTable数组.否则不做操作
        sb.append("    if tonumber(ARGV[i]) > tonumber(redisQtys[i]) then ");
        sb.append("      myTable[#myTable + 1] = KEYS[i] .. '=' .. tonumber(redisQtys[i]) ");
        sb.append("    end ");
        sb.append(" end ");
        //如果myTable不为空,则返回库存不足,显示出商品id和库存数量
        sb.append("    if #myTable > 0 then ");
        sb.append("     return myTable ");
        sb.append("    end");
        //如果myTable为空,则做减库存.出库操作,返回空数组,
        sb.append(" for i=1, #KEYS  do");
        sb.append("   redis.call('decrby',KEYS[i],ARGV[i]) ");
        sb.append(" end ");
        sb.append(" return {}");
        RedisScript<List> script = RedisScript.of(sb.toString(), List.class);
        List<String> keys = myProDucts1.stream().map(it -> it.getProductId()).collect(Collectors.toList());
        Object[] qtys = myProDucts1.stream().map(it -> it.getQty()+"").toArray();
        List list = stringRedisTemplate.execute(script, keys, qtys);

        if (list.isEmpty()) {
            System.out.println(StrUtil.format("下单成功"));
        } else {
            System.out.println(StrUtil.format("下单失败,{}", list));
        }

    }
}

测试类

复制代码
@Data
@Accessors(chain = true)
public class MyProduct {
    private String productId;
    private Integer qty;
}

只有+""才能是 arg...

相关推荐
逝水无殇8 分钟前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
这是个栗子1 小时前
前端开发中的常用工具函数(八)
开发语言·前端·javascript
凤凰院凶涛QAQ1 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
研☆香1 小时前
为什么变量声明在赋值前也能使用?—— 深入理解 JavaScript 变量提升与作用域
开发语言·前端·javascript
右耳朵猫AI2 小时前
PHP周刊2026W28 | 安全更新、Laravel 13.18、Twig 3.28
开发语言·php·laravel
second602 小时前
第一部分:快速上手 —— 建立 C++ 基本语法与编程范式
开发语言·c++
郝学胜-神的一滴2 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
bksczm2 小时前
linux之线程概念和控制
linux·开发语言·c++
JackieZhengChina3 小时前
零依赖轻量级JS悬浮提示插件title2tip-js的使用教程
开发语言·javascript·ecmascript
hehelm3 小时前
Linux网络编程—TCP字典翻译系统
linux·开发语言·网络·c++·tcp/ip