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




![数组A[m+n]中存放了两个线性表(a1,a2,.....am)和(b1,b2.....bn),将数组中的两个线性表的位置互换,要求空间复杂度为1](https://img-blog.csdnimg.cn/direct/b89c088050a3465eadf6b77c919da020.png)









![Unity编程#region..#endregion以及面板提示语标签[Tooltip(““)]](https://img-blog.csdnimg.cn/direct/d11e37f6b8244ad8ac2e85e1527a2c24.png)




