当前位置: 首页 > article >正文

lua脚本保证多条命令原子性

这里使用一个例子,实现下图功能

步骤一:在resource目录下定义lua脚本

local voucherId = ARGV[1]
-- 1.2.用户id
local userId = ARGV[2]


-- 2.数据key
-- 2.1.库存key
local stockKey = 'seckill:stock:' .. voucherId
-- 2.2.订单key
local orderKey = 'seckill:order:' .. voucherId

-- 3.脚本业务
-- 3.1.判断库存是否充足 get stockKey
if(tonumber(redis.call('get', stockKey)) <= 0) then
    -- 3.2.库存不足,返回1
    return 1
end
-- 3.2.判断用户是否下单 SISMEMBER orderKey userId
if(redis.call('sismember', orderKey, userId) == 1) then
    -- 3.3.存在,说明是重复下单,返回2
    return 2
end
-- 3.4.扣库存 incrby stockKey -1
redis.call('incrby', stockKey, -1)
-- 3.5.下单(保存用户)sadd orderKey userId
redis.call('sadd', orderKey, userId)
return 0

步骤二:在使用的类里常见脚本并配置

private static final DefaultRedisScript<Long> UNLOCK_SCRIPT;
    static {
        UNLOCK_SCRIPT = new DefaultRedisScript<>();
        UNLOCK_SCRIPT.setLocation(new ClassPathResource("voucher.lua")); //设置lua脚本的位置
        UNLOCK_SCRIPT.setResultType(Long.class); //返回值
    }

步骤三:调用脚本

    Long result = stringRedisTemplate.execute(
            SECKILL_SCRIPT,
            Collections.emptyList(), //KEYS
            voucherId.toString(), userId.toString()//ARGV
    );


http://www.kler.cn/a/291120.html

相关文章:

  • 【服务器】MyBatis是如何在java中使用并进行分页的?
  • 2024年合肥师范学院信息安全小组内部选拔赛(c211)WP
  • C05S07-Tomcat服务架设
  • OneCode:开启高效编程新时代——企业定制出码手册
  • 5G 模组 初始化状态检测
  • @pytest.fixture() 跟 @pytest.fixture有区别吗?
  • 面向对象程序设计原则——里氏替换原则(LSP)
  • 【Linux操作系统】线程控制
  • 16 C语言连接
  • ***萌新6:24点(爆搜)
  • C++类与对象---日期类
  • 【陪诊系统-PC管理端】axios的二次封装
  • OpenCV图像与视频分析笔记 — 视频部分
  • python---爬取QQ音乐
  • 时序预测 | 基于MAMbaS+transformer时间序列预测模型(pytorch)
  • 【JAVA入门】Day32 - 可变参数
  • Readelf 获取Android So `.note.android.ident`
  • C#自定义控件的放置与拖动
  • oh my posh随机选择主题
  • 大坝安全监测设备的工作原理
  • 如何使用 Ruby 中的 Selenium 解决 CAPTCHA
  • STM32的窗口看门狗详解及案例(基于HAL库)
  • Python知识点:如何使用Python实现语音识别
  • imap发送邮件:如何配置IMAP服务器发邮件?
  • 基础学习之——Apache Spark
  • 【项目一】基于pytest的自动化测试框架day1