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 是商品库存

相关推荐
難釋懷7 小时前
Redis命令-Set命令
数据库·redis·缓存
编程小风筝7 小时前
Spring 框架如何整合Redis缓存中间件?
redis·spring·缓存
Linux-palpitate7 小时前
PostgreSQL(PG)的1主2从集群部署安装
数据库·postgresql
heartbeat..8 小时前
数据库基础知识体系:概念、约束、范式与国产产品
java·数据库·学习笔记·国产数据库
山峰哥8 小时前
数据库工程核心:SQL调优让查询效率飙升的实战密码
网络·汇编·数据库·sql·编辑器
Coder_Boy_9 小时前
基于SpringAI的在线考试系统-DDD业务领域模块设计思路
java·数据库·人工智能·spring boot·ddd
小雪_Snow10 小时前
Windows 安装 MySQL 8.0 教程【安装包方式】
数据库·mysql
无敌的牛10 小时前
MySQL初阶
数据库·mysql
不会C++的雾10 小时前
Linux操作系统(2)
linux·数据库·mysql
java_python源码11 小时前
springboot+vue智慧小区管理系统(源码+文档+调试+基础修改+答疑)
数据库·oracle