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 小时前
限流的算法
java·开发语言
Hi_kenyon3 小时前
VUE3套用组件库快速开发(以Element Plus为例)二
开发语言·前端·javascript·vue.js
曲莫终3 小时前
Java VarHandle全面详解:从入门到精通
java·开发语言
ghie90903 小时前
基于MATLAB GUI的伏安法测电阻实现方案
开发语言·matlab·电阻
Gao_xu_sheng3 小时前
Inno Setup(专业安装/更新 EXE)
开发语言
吴声子夜歌4 小时前
Java数据结构与算法——基本数学问题
java·开发语言·windows
wanglei2007085 小时前
生产者消费者
开发语言·python
leo__5205 小时前
基于菲涅耳衍射积分的空心高斯光束传输数值模拟(MATLAB实现)
开发语言·matlab
昵称已被吞噬~‘(*@﹏@*)’~5 小时前
【RL+空战】学习记录03:基于JSBSim构造简易空空导弹模型,并结合python接口调用测试
开发语言·人工智能·python·学习·深度强化学习·jsbsim·空战