如何解决秒杀商品时,商品超卖的情况

文章的思路主要来源于:http://www.csdn.net/article/2014-11-28/2822858

解决方案(以下方案都是基于分布式的redis缓存):

1.用队列解决大并发

建立一条队列,将每个请求加入到队列中,然后异步获取队列数据进行处理,把多线程的事情变成单线程,处理完一个就从队列中删除一个。但是会出现一个现象,请求特别多的时候,一瞬间将redis队列内存撑爆,导致系统异常,又或者队列内存足够大,也是一种方案,但是,系统处理完一个队列内请求的速度根本无法和疯狂涌入队列中的数目相比。也就是说,队列内的请求会越积累越多,最终Web系统平均响应时候还是会大幅下降,系统还是陷入异常

2.利用redis中基于cas的乐观锁

采用计数器的方式,用一个集合,存放每个商品以及其对应的数量,如果只是单纯的decr函数或者是incr函数,不能解决秒杀这种问题。因为有可能在并发的情况下,两个请求取到的数都是0,然后都加1,结果为1,实际上应该是2。那么这个时候建议利用乐观锁,实现自己的decr函数。

乐观锁的机制如同版本控制,如果修改的时候,要修改的value在redis中的值已经跟取出来时不一样,则修改失败。

def incr($key)
WATCH $key
$value=GET $Key
if not $value
$value=0
$value=$value+1
MULTI
set $key,$value
$result=EXEC
return result[0]
秒杀开始之前,将库存量放到Redis当中,然后,对待每个请求,先判断是否大于0,是的话,就去进行库存量减一操作,如果成功,则商品信息加入购物车当中,如果失败,则不能加入到购物车,返回秒杀失败;小于0则直接返回秒杀失败。


没有更多推荐了,返回首页