在电商系统里面超卖永远是一个绕不开的话题,如果一个系统出现了大面积的超卖,整个研发团队估计都逃不过凉凉的结局。所以这篇我们介绍下如何解决秒杀系统里面的超卖情况。再普及下超卖是什么意思。
“超卖”就是说卖出的商品数量比商品的库存数量多,这在电商领域是一个非常严重的问题。
上面提到我们的库存会提前在缓存中被扣一次,只有扣成功之后,后面的业务逻辑处理才会继续进行下去,那如果我们解决了前置缓存扣减库存的原子性,是不是就不会出现超卖的情况呢?
所以我们主要的方案就是采用redis扣库存的原子性操作。使用lua脚本代码,话不多说,直接上lua脚本代码
local resultFlag = "0" local n = tonumber(ARGV[1]) local key = KEYS[1] local goodsInfo = redis.call("HMGET",key,"totalCount","seckillCount") local total = tonumber(goodsInfo[1]) local alloc = tonumber(goodsInfo[2]) if not total then return resultFlag end if total >= alloc + n then local ret = redis.call("HINCRBY",key,"seckillCount",n) return tostring(ret) end return resultFlag
有了lua脚本,java怎么调用呢?
public int stockKill(String id, int number) { String key = getCacheKey(id); Object seckillCount = redisTemplate.execute(script, Arrays.asList(key), String.valueOf(number)); return Integer.valueOf(seckillCount.toString()); }
这样子扣减库存就是原子性操作,从而有效解决了超卖的问题。
还没有评论,来说两句吧...