高并发性能提升和超卖的解决方案
2016-06-07 10:11
295 查看
背景介绍:
对于一个互联网平台来说,高并发是经常会遇到的场景。最有代表性的比如秒杀和抢购。高并发会出现三个特点:
1、高并发读取
2、高并发写入(一致性)
3、出现超卖问题
如何有效的解决这三个问题是应对高并发的关键。
一般系统都分为前端和后端。
前端如何应对?
1、缓存静态数据,例如图片,html页面,js等
2、搭建负载均衡集群,目前采用较多的为nginx
3、进行ip限制,限制同一个ip单位时间内发起的请求数量。或者建立ip黑名单,避免恶意攻击
4、考虑系统降级。比如当达到系统负载的时候返回一个静态处理页面
后端如何应对?
1、采用mysql读写分离,但是当高并发的时候mysql性能会降低。 一般来说,MySQL的处理性能会随着并发thread上升而上升,但是到了一定的并发度之后会出现明显的拐点,之后一路下降,最终甚至会比单thread的性能还要差。比如加减库存的操作,通常并发量不高的做法为:update xxx set count=count-xx where curcount>xx;这样可以充分利用mysql的事务锁来避免出现超卖的情况。但是并发量上了后,会因为排他锁等待而大大降低性能。
2、采用redis数据库,前置到mysql。思路如下:
2.1系统启动后,初始化sku信息到redis数据库,记录其可用量和锁定量
2.2使用乐观锁,采用redis的watch机制。逻辑为:
1.定义门票号变量,设置初始值为0。watchkey
2.watch该变量,watch(watchkey);
3.使用redis事务加减库存。首先获取可用量和抢购量比较,如果curcount>buycount,那么正常执行减库存和加锁定量操作:
multi;
redis incr watchkey;
redis decrby curcount buycount;
redis incrby lockcount buycount;
exec;
由于上述操作都在事务内进行,一旦watchkey被其他的事务修改过,那么exec将返回nil,如此就放弃本次请求。一般都是在循环中重复尝试直到成功或没有可用量。
最后通过订单信息流,保证mysql数据库的最终一致性。
3、其他方式希望大家补充!
对于一个互联网平台来说,高并发是经常会遇到的场景。最有代表性的比如秒杀和抢购。高并发会出现三个特点:
1、高并发读取
2、高并发写入(一致性)
3、出现超卖问题
如何有效的解决这三个问题是应对高并发的关键。
一般系统都分为前端和后端。
前端如何应对?
1、缓存静态数据,例如图片,html页面,js等
2、搭建负载均衡集群,目前采用较多的为nginx
3、进行ip限制,限制同一个ip单位时间内发起的请求数量。或者建立ip黑名单,避免恶意攻击
4、考虑系统降级。比如当达到系统负载的时候返回一个静态处理页面
后端如何应对?
1、采用mysql读写分离,但是当高并发的时候mysql性能会降低。 一般来说,MySQL的处理性能会随着并发thread上升而上升,但是到了一定的并发度之后会出现明显的拐点,之后一路下降,最终甚至会比单thread的性能还要差。比如加减库存的操作,通常并发量不高的做法为:update xxx set count=count-xx where curcount>xx;这样可以充分利用mysql的事务锁来避免出现超卖的情况。但是并发量上了后,会因为排他锁等待而大大降低性能。
2、采用redis数据库,前置到mysql。思路如下:
2.1系统启动后,初始化sku信息到redis数据库,记录其可用量和锁定量
2.2使用乐观锁,采用redis的watch机制。逻辑为:
1.定义门票号变量,设置初始值为0。watchkey
2.watch该变量,watch(watchkey);
3.使用redis事务加减库存。首先获取可用量和抢购量比较,如果curcount>buycount,那么正常执行减库存和加锁定量操作:
multi;
redis incr watchkey;
redis decrby curcount buycount;
redis incrby lockcount buycount;
exec;
由于上述操作都在事务内进行,一旦watchkey被其他的事务修改过,那么exec将返回nil,如此就放弃本次请求。一般都是在循环中重复尝试直到成功或没有可用量。
最后通过订单信息流,保证mysql数据库的最终一致性。
3、其他方式希望大家补充!
相关文章推荐
- GAMIT 软件中 trackRT 模块的安装
- 【leetcode】191. Number of 1 Bits
- UniEAP Platform开发环境搭建
- c#转换ASCII,很不错
- 乐视乐2怎么恢复误删照片
- jQuery控制div实现随滚动条滚动效果
- UML类图几种关系的总结
- 笔记之解决ScrollView起始位置不是最顶部的问题
- java的if else语句入门
- Android Studio 修改包名packageName
- C#委托和事件的困惑
- 机器学习笔记(一)——线性回归算法
- ble4.0节省功耗原因
- 替换a b 的值,不借助过度变量(两值相互替换不借助中间变量)
- Jboss的JBWEB000065: HTTP Status 404 原因
- 捕获Home键
- SqlServer索引的原理与应用
- MacOSX中使用NSWindow创建背景透明的窗体
- js判断输入的数据是否是正整数,包括100.00(100.000)
- Linux系统启动过程