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

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

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

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

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

java 复制代码
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); //返回值
    }

步骤三:调用脚本

java 复制代码
    Long result = stringRedisTemplate.execute(
            SECKILL_SCRIPT,
            Collections.emptyList(), //KEYS
            voucherId.toString(), userId.toString()//ARGV
    );
相关推荐
槑有烦恼27 分钟前
Java 字符串 & List集合 高频易错真题复盘(含全部错题+修正)
java
语戚29 分钟前
力扣 1621. 大小为K的不重叠线段的数目:动态规划(Java 实现)
java·算法·leetcode·动态规划·力扣·dp
君顾139 分钟前
本地托管机构管理源码实战:需求拆解、数据建模与多端部署
java·开发语言·托管
青山木39 分钟前
Hot 100 --- 最长有效括号
java·数据结构·算法·leetcode·动态规划
xcl09251 小时前
本地电竞服务交易系统架构设计与实战:从同城匹配到订单履约
java·spring boot
曹牧1 小时前
SVN 上查找文件
java
加贝哥|usun1 小时前
maven项目从外网搬迁至内网-本地仓库(不搭建私服)
java
paopaokaka_luck2 小时前
小学非遗科普平台(AI 非遗科普问答,ECharts学情数据、非遗资源分类与审核,资源收藏下载与学习记录,学习任务发布和作品评分,活动报名签到与统计)
java·人工智能·spring·信息可视化·数据分析·echarts
传奇开心果编程2 小时前
【Rust入门练中学】 第3课:数据类型
开发语言·学习·rust
Yize.2 小时前
Spring Task定时任务全解析:从入门到实战
java·spring