如何解决秒杀商品时,商品超卖的情况
2015-06-14 20:59
316 查看
文章的思路主要来源于: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中的值已经跟取出来时不一样,则修改失败。
解决方案(以下方案都是基于分布式的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则直接返回秒杀失败。
相关文章推荐
- 测试Handler
- Java与微信不得不说的故事——实现微信公众平台与sae服务器的对接
- Codeforces Round #305 (Div. 1)
- Windows各个系列的服务器版本
- win2012 64位系统 iis8支持32位数据库
- [Swust OJ 1126]--神奇的矩阵(BFS,预处理,打表)
- Windows7系统电脑出现蓝屏该怎么处理?
- UI design
- Mysql error 1217
- HDU3605Escape(最大流SAP+状态压缩优化点的个数)
- Cocos2dx基础使用相关面试题
- 谷歌是如何get到设计这个技能的?
- winsows下面firefly服务器搭建
- SQLite数据库增删改查操作
- linux程序设计——内存管理(第七章)
- C++中的临时对象
- 《浪潮之巅》读书笔记3
- vim秒变成source insight,内附安装脚本和资源链接
- java下的串口通信-RXTX
- LVS+Keepalived负载均衡集群之DR模式