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...

相关推荐
咸鱼2.01 小时前
【java入门到放弃】Dubbo
java·开发语言·dubbo
JAVA面经实录9177 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
周杰伦fans8 小时前
AutoCAD .NET 二次开发:深入理解 EntityJig 的工作原理与正确实现
开发语言·.net
Bat U10 小时前
JavaEE|多线程初阶(七)
java·开发语言
谭欣辰10 小时前
C++ 排列组合完整指南
开发语言·c++·算法
foundbug99911 小时前
自适应滤除直达波干扰的MATLAB实现
开发语言·算法·matlab
XDH_CS11 小时前
MySQL 8.0 安装与 MySQL Workbench 使用全流程(超详细教程)
开发语言·数据库·mysql
小短腿的代码世界12 小时前
Qt实时盈亏计算深度解析:从持仓数据到动态盈亏展示
开发语言·qt
小康小小涵12 小时前
基于ESP32S3实现无人机RID模块底层源码编译
linux·开发语言·python