• Lua脚本之库存


    1. @SpringBootTest
    2. public class MyluaTest {
    3. @Autowired
    4. private StringRedisTemplate stringRedisTemplate;
    5. @Resource(name = "redisTemplate")
    6. private ValueOperations valueOperations;
    7. @Test
    8. void test() {
    9. valueOperations.set("pi1", 14);
    10. valueOperations.set("pi2", 11);
    11. valueOperations.set("pi3", 6);
    12. }
    13. @Test
    14. void test1() {
    15. ArrayList<MyProduct> myProDucts1 = CollUtil.newArrayList(new MyProduct().setProductId("pi1").setQty(14),
    16. new MyProduct().setProductId("pi2").setQty(11),
    17. new MyProduct().setProductId("pi3").setQty(6)
    18. );
    19. StringBuilder sb = new StringBuilder();
    20. //查看商品id的库存实际数量
    21. sb.append(" local redisQtys = redis.call('mget',unpack(KEYS)) ");
    22. sb.append(" local myTable = {} ");
    23. sb.append(" for i = 1, #KEYS do ");
    24. //判断若需求量大于库存量,把商品id和库存量放入myTable数组.否则不做操作
    25. sb.append(" if tonumber(ARGV[i]) > tonumber(redisQtys[i]) then ");
    26. sb.append(" myTable[#myTable + 1] = KEYS[i] .. '=' .. tonumber(redisQtys[i]) ");
    27. sb.append(" end ");
    28. sb.append(" end ");
    29. //如果myTable不为空,则返回库存不足,显示出商品id和库存数量
    30. sb.append(" if #myTable > 0 then ");
    31. sb.append(" return myTable ");
    32. sb.append(" end");
    33. //如果myTable为空,则做减库存.出库操作,返回空数组,
    34. sb.append(" for i=1, #KEYS do");
    35. sb.append(" redis.call('decrby',KEYS[i],ARGV[i]) ");
    36. sb.append(" end ");
    37. sb.append(" return {}");
    38. RedisScript<List> script = RedisScript.of(sb.toString(), List.class);
    39. List<String> keys = myProDucts1.stream().map(it -> it.getProductId()).collect(Collectors.toList());
    40. Object[] qtys = myProDucts1.stream().map(it -> it.getQty()+"").toArray();
    41. List list = stringRedisTemplate.execute(script, keys, qtys);
    42. if (list.isEmpty()) {
    43. System.out.println(StrUtil.format("下单成功"));
    44. } else {
    45. System.out.println(StrUtil.format("下单失败,{}", list));
    46. }
    47. }
    48. }

    测试类

    1. @Data
    2. @Accessors(chain = true)
    3. public class MyProduct {
    4. private String productId;
    5. private Integer qty;
    6. }

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

  • 相关阅读:
    【C++】万字一文全解【继承】及其特性__[剖析底层化繁为简](20)
    ARP欺骗攻击实操
    关于产研项目管理的一些思考与记录
    vue中的 render 和 h() 详解
    【教学类-41】翻页连环画4.0(双面2份,正反2种图案翻页)表情包
    C#重启 --- 数据类型
    【SQL语法与数据库】
    虚拟局域网技术 (VLAN技术、tag帧、交换机端口的VLAN属性、以太网交换机的转发流程)
    昨天同事lastday,把前端测试包扔线上去了
    TRex学习之旅四
  • 原文地址:https://blog.csdn.net/weixin_52449894/article/details/141069994