商品超卖的原因是在高并发场景下,业务层面扣库存和库存的判断会出现并发情况,但是使用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 是商品库存