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

相关推荐
zhangfeng113315 分钟前
台大李宏毅老师讲解memba和类似linear atttenion 模型,笔记
开发语言·人工智能·笔记
Chris _data1 小时前
并发单词频率统计器 - 从零到完整实现(C# 实战)
开发语言·c#
idolao1 小时前
Oligo 7.60 安装教程:引物设计+Java 环境配置
java·开发语言
不知名的老吴1 小时前
Lambda表达式与新的Streams API相结合
开发语言·python
石山代码8 小时前
ArrayList / HashMap / ConcurrentHashMap
java·开发语言
程序大视界8 小时前
【Python系列课程】Python正则表达式(下):环视、命名分组与日志实战
开发语言·python·正则表达式
枫叶v.9 小时前
Agent 分层存储架构设计:从记忆方法到中间件选型
开发语言·python
sleven fung10 小时前
MinerU与BabelDOC与KTransformers与OpenAI API库
开发语言·python·ai·langchain
萤萤七悬10 小时前
【Python笔记】AI帮实现CLI工具-使用argparse.ArgumentParser接收命令参数
开发语言·笔记·python
iCxhust11 小时前
C# 命令行指令 查看二进制文件
开发语言·单片机·嵌入式硬件·c#·proteus·微机原理·8088单板机