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

相关推荐
Lucis__31 分钟前
再探类&对象——C++入门进阶
开发语言·c++
007php00732 分钟前
某大厂跳动面试:计算机网络相关问题解析与总结
java·开发语言·学习·计算机网络·mysql·面试·职场和发展
lsx2024061 小时前
HTML 字符集
开发语言
很㗊1 小时前
C与C++---类型转换
c语言·开发语言
say_fall1 小时前
精通C语言(3. 自定义类型:联合体和枚举)
c语言·开发语言
郝学胜-神的一滴2 小时前
Effective Python 第43条:自定义容器类型为什么应该从 `collections.abc` 继承?
开发语言·python
jndingxin2 小时前
c++多线程(6)------ 条件变量
开发语言·c++
共享家95272 小时前
QT-常用控件(二)
开发语言·qt
ytttr8732 小时前
混合动力汽车MATLAB建模实现方案
开发语言·matlab·汽车
jerryinwuhan2 小时前
最短路径问题总结
开发语言·人工智能·python