码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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...

  • 相关阅读:
    阿里怎么用DDD来拆分微服务?
    springboot社工服务中心管理信息系统毕业设计源码021009
    FDWS9510L-F085车规级 PowerTrench系列 P沟道增强型MOS管
    【JavaEE初阶】网络原理|认识协议|协议分层|TCP/IP模型|封装和分用
    人力资源APP功能
    D. Progressions Covering(思维 + 贪心 + 线段树 + 差分)
    03-条件分支及循环
    【等保常见问题解答】等保测评机构能帮忙做等保整改吗?
    华为机试真题 C++ 实现【消消乐游戏】【字符串消除】
    广州小程序开发公司怎么找?
  • 原文地址:https://blog.csdn.net/weixin_52449894/article/details/141069994
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号