Redis+lua 解决秒杀超卖问题

商品超卖的原因是在高并发场景下,业务层面扣库存和库存的判断会出现并发情况,但是使用lua 脚本,就会避免超卖的发生。

1.在项目resources文件夹创建一个名为 stock.lua的脚本

复制代码
if (redis.call('hexists', KEYS[1], KEYS[2]) == 1) then
	local stock = tonumber(redis.call('hget', KEYS[1], KEYS[2]));
	if (stock > 0) then
	   redis.call('hincrby', KEYS[1], KEYS[2], -1);
	   return stock;
	end;
    return 0;
end;

2.Redis 配置类中添加以下代码:

复制代码
@Bean
public DefaultRedisScript<Long> stockScript() {
    DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
    //放在和application.yml 同层目录下
    redisScript.setLocation(new ClassPathResource("stock.lua"));
    redisScript.setResultType(Long.class);
    return redisScript;
}

3.扣减库存

key是redis的商品id key

amount 是商品库存

相关推荐
Traving Yu17 分钟前
向量数据库Milvus
数据库·人工智能·milvus
2501_9010064721 分钟前
golang如何使用DTM分布式事务框架_golang DTM分布式事务框架使用方法
jvm·数据库·python
2501_9012005326 分钟前
Golang如何做Clean Architecture_Golang整洁架构教程【详解】
jvm·数据库·python
咖啡里的茶i26 分钟前
实验三 数据完整性实验
数据库·oracle
韶博雅27 分钟前
oracle + parfile(数据泵)
数据库·oracle
weixin_4597539429 分钟前
Go 中嵌入类型字段在派生结构体字面量中的初始化规则详解
jvm·数据库·python
CLX050530 分钟前
HTML5中Mediastream实现摄像头画面实时捕获
jvm·数据库·python
Hello.Reader34 分钟前
算法基础(十三)——随机算法为什么有时主动引入随机性
java·数据库·算法
iAm_Ike41 分钟前
PHP错误和异常如何处理_PHP错误与异常处理机制详解【详解】
jvm·数据库·python
m0_631529821 小时前
宝塔面板安装后无法修改配置文件_处理chattr锁定属性
jvm·数据库·python