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
    );
相关推荐
AI视觉网奇14 分钟前
动作识别 视频理解大模型
开发语言·python·音视频
Suxing930 分钟前
C语言基础分享:从“租房”到“拆迁”,C语言动态内存管理
java·数据结构·算法
减瓦31 分钟前
别让 Java 版本选择变成生产事故
java
ikun_文32 分钟前
Java集合框架Collection拓展进阶
java·java ee
SomeB1oody41 分钟前
【RustyML入门】3.8. 正则化与归一化层
开发语言·后端·机器学习·rust·教程
天疆说42 分钟前
04 稳定性与性能调优实录:OOM 崩溃、并发槽位、前缀缓存与 DSpark 调参
linux·运维·缓存
__zRainy__44 分钟前
Node系列 · Node基础:全局变量与全局对象
开发语言·前端·javascript
码匠许师傅1 小时前
【C++ 面试真题】聊聊 C++ 的虚函数和多态
java·c++·面试
csdn2015_1 小时前
springboot +mybatis 查询myql开启程序级别缓存
spring boot·缓存·mybatis
隔窗听雨眠1 小时前
缓存增强生成CAG:用预加载KV缓存突破RAG实时检索瓶颈
缓存