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

相关推荐
码明1 小时前
42.MySQL视图
数据库·oracle
山茶花开时。2 小时前
[Oracle] TO_NUMBER()函数
数据库·oracle
超龄超能程序猿2 小时前
闸机控制系统从设计到实现全解析:第 4 篇:Redis 缓存与分布式锁实现
redis·分布式·缓存
AA-代码批发V哥3 小时前
Redis之Set和SortedSet类型常用命令
redis
耳东哇3 小时前
阿里云百炼平台创建智能体-上传文档
数据库·redis·阿里云
ykuaile_h85 小时前
MySQL梳理三:查询与优化
数据库·mysql
掘根5 小时前
【Redis】string字符串
数据结构·数据库·redis
春天的菠菜6 小时前
【mysql】设置mysql数据库只读权限用户
数据库·oracle
找不到、了6 小时前
Mysql使用Canal服务同步数据->ElasticSearch
数据库·mysql·elasticsearch
宋大水7 小时前
【大作业-12】草莓成熟度检测模型,YOLO+PyQt+MySQL
数据库·深度学习·mysql·yolo·目标检测·pyqt·课程设计