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

相关推荐
~~李木子~~3 小时前
MySQL 迁移总结报告
数据库·mysql
有梦想的攻城狮4 小时前
通过Lettuce实现PB3格式对象在Redis中的存储与查询
数据库·redis·缓存·pb3
小坏讲微服务4 小时前
Spring Boot整合Redis注解,实战Redis注解使用
spring boot·redis·分布式·后端·spring cloud·微服务·mybatis
桦04 小时前
MySQL【函数】
数据库·mysql
⑩-5 小时前
Redis(1)
数据库·redis·缓存
2301_803554525 小时前
主从同步配置的步骤
数据库
无敌最俊朗@5 小时前
00-7天攻破sqlite数据库(总览sqlite)
数据库·sqlite
Access开发易登软件5 小时前
Access导出带图表的 HTML 报表:技术实现详解
数据库·后端·html·vba·导出·access
_Minato_6 小时前
数据库知识整理——SQL数据定义
数据库·sql·mysql·oracle·database·数据库开发·数据库架构
程序员卷卷狗6 小时前
MySQL 四种隔离级别:从脏读到幻读的全过程
数据库·mysql