基于Redis的高并发程序设计_第1页
基于Redis的高并发程序设计_第2页
基于Redis的高并发程序设计_第3页
基于Redis的高并发程序设计_第4页
基于Redis的高并发程序设计_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于基于RedisRedis的高并发程序设计的高并发程序设计 -电商类秒杀、抢购、预约投资场景的解决方案2015年11月26日通用技术组-张晓明提纲提纲一:背景一:背景二:技术选型二:技术选型三:设计思路及折衷三:设计思路及折衷四:系统功能设计四:系统功能设计五:系统架构设计五:系统架构设计六:服务器部署六:服务器部署七:数据库设计七:数据库设计八:数据初始化及抢购流程八:数据初始化及抢购流程九九:其他方案其他方案-理财预约投资方案理财预约投资方案通用技术组一、背景一、背景通用技术组 对电商类项目的秒杀、抢购、预约理财等高并发场景进行抽象,设计出有针对性的系统架构,以支撑此类场景的业务需求。1

2、.1.设计的目标设计的目标能支撑4万并发请求(QPS)。2.2.实现的功能实现的功能前台商品展示;商品抢购、秒杀;后台管理。3.3.性能指标及数据量预估性能指标及数据量预估用户总量3000万,活跃用户30万,同时在线 3万,日请求量1亿+。接口响应时间200200ms以内, 所有接口响应时间不超过500500ms。系统能支撑40000 40000 QPS的压力。4.4.难点难点高并发、数据一致性、反作弊二、技术选型二、技术选型通用技术组技术选型- LTMRPLinuxLinux: 公司标准型服务器公司标准型服务器 16核 16G内存 CentOS6.5 内核 2.6.32-431.el6.x8

3、6_64 有条件的可以用PAAS平台,以提高扩容的灵活性和及时性。TengineTengine:经过淘宝、天猫高并发检验,兼容Nginx且比Nginx更高效、稳定、灵活MySQLMySQL:关键数据需要持久化到MySQL数据库中 MySQL5.5 (InnoDB,单机1w+ Read/Sec,4k1.5wWrite/Sec MaxConnection 1.5k)RedisRedis: 高效、灵活,适用于高并发场景 Redis3.0 (单机10G内存)PHPPHP: PHP5.5(php-fpm)框架:框架: 轻型PHP框架,敏捷开发 Yaf、ThinkPHP三、设计思路及折衷三、设计思路及折衷

4、通用技术组 支撑4w QPS分析 认为瓶颈可能在WebServer、MySQL、Redis1 1)WebServerWebServer方面方面 采用比采用比NginxNginx更高效、稳定、易用的更高效、稳定、易用的Tengine+phpTengine+php-fpm-fpm 公司标准服务器 16G内存,每个php-fpm进程占用20M左右,单台大约能起 800个php-fpm进程。 接口响应时间控制在200ms以内,复杂接口响应时间不超过500ms。 综上单台服务器理论QPS能达到4000,能支撑4wQPS需要10台WebServer2 2)RedisRedis方面方面 利用Redis敏捷高

5、效的特性,将请求压力落到Redis上,以保证接口的响应时间 Redis业界压测数据为单机读写810w QPS,预计每个请求读写次数为45次, 2台即可支撑。3 3)MySQLMySQL方面方面 MySQL5.5(InnoDB,单机1w 读/Sec,4k1.5w写/Sec 最大连接数1.5k ), 预计三、四台机器即可支撑。四、系统功能设计四、系统功能设计通用技术组1.1.前台前台前端静态资源采用CDN加速。前台登录模块采用Passport服务。2.2.后台后台后台权限由OA+一点登录系统提供服务并利用VPN(IP白名单)进行访问限制商品图片等信息由搜索组提供的上传接口以及存储服务保证。日志分析

6、以及数据统计由数据中心提供服务。3.3.接口接口首先经过WAF安全过滤。其次经过前端转发机进行请求分发,做到负载均衡。程序方面对请求进行反作弊过滤。4.4.数据存储数据存储商品、订单以及用户信息需要持久化到MySQL表中。通过后台将MySQL数据load到Redis中,Redis中的数据是非敏感数据,为了以 防万一,需额外提供容灾策略(比如关键数据需Redis+MySQL双写,跑脚本定时持久化到MySQL中)。四、系统功能设计四、系统功能设计通用技术组5.5.数据一致性数据一致性 a.a.如何避免商品超发如何避免商品超发首先在后台设置,将一定数量的商品生成对应的一组数据(MySQL,每条记录有

7、个唯一ID ),并将这组ID 利用Redis sadd到指定的集合中(rs:po:2115),当并发抢购时spop出 一个随机预售ID给当前用户,用户拿着这个ID去MySQL中查询比对,如果确实存在则利用selectfor update 事 务查询并更新库存,生成订单,同时标注预售表信息(注意:此时放进来的请求是有限 的,压力小了很多)。如果spop失败,说明预售商品已经被抢购一空,会引导至错误提示页面,提示抢购失败 b.b.如何限制同一用户的购买次数(限购)如何限制同一用户的购买次数(限购)方案一:采用互斥锁方案一:采用互斥锁假设收到用户ID为9500088的抢购商品ID为2115的请求,先

8、判断集合rs:po:2115是否有剩 余的预售ID以及rs:xg:2115:9500088的值确定此用户是否达到限购次数,如果没有剩余 的预售ID或用户达到限购次数则直接返回。如果通过两项校验则放行,执行以下操作:四、系统功能设计四、系统功能设计通用技术组setnxsetnx rs:lock:9500088 rs:lock:9500088/加互斥锁expire rs:lock:9500088 15expire rs:lock:9500088 15/设置锁的过期时间,以防死锁spopspop rs:po:2115 rs:po:2115/获得预售ID(取号)incrincr rs:xg:2115:

9、9500088 rs:xg:2115:9500088/记录限购次数saddsadd rs:xg:2115 9500088 rs:xg:2115 9500088/放入集合,为清理工作做准备ProcessProcess/购买商品处理过程del rs:lock:9500088del rs:lock:9500088/删除互斥锁(释放锁)方案二:采用方案二:采用RedisRedis Watch Watch机制机制假设收到用户ID为9500088的抢购商品ID为2115的请求,先判断预售集合是否有剩余预售 ID(scard 0),同时判读此用户是否达到限购次数,如果预售ID已发完或用户达到限购次数则直接返

10、回。如果以上两条件都通过则放行,执行以下Redis的事务:watch rs:xg:2115:9500088watch rs:xg:2115:9500088/监控数据multimulti/事务开始 spopspop rs:po:2115 rs:po:2115/发号 incrincr rs:xg:2115:9500088 rs:xg:2115:9500088 /记录限购次数 saddsadd rs:xg:2115 9500088 rs:xg:2115 9500088/放入集合,为清理工作做准备execexec/执行事务四、系统功能设计四、系统功能设计通用技术组 获得执行结果后对结果进行校验,根据情

11、况进行逻辑处理:如果spop返回值是false, 或者rs:xg:2115:9500088大于限购次数,需要做相应的逆操作,并提示抢购失败。 以上可以防止同一用户的并发请求,保证同一用户的多个请求只能有一个成功。此用户获 得预售商品ID后如果后续处理失败需要将预售商品ID返还,并将限购key rs:xg:2115:9500088 decr6.6.反作弊策略反作弊策略 接口WAF防护,后台VPN访问限制 利用Socket服务进行访问频次、IP等限制(此服务应达到4wQPS)。 接口参数加签名。 适时启用验证码或短信验证码措施。 利用RC4可逆算法将用户特征信息种到COOKIE中进行校验 Refe

12、rer及UA限制。 后台提供手动封禁/解封用户或者封IP、IP段等功能。 后验证方式,通过数据中心的数据分析(用户画像),发现作弊行为则订单视为无效。五、系统架构设计五、系统架构设计通用技术组六、服务器部署六、服务器部署通用技术组七、数据库设计数据库设计1. 1. MySQLMySQL数据库设计数据库设计请见概要设计文档2. 2. RedisRedis数据库设计数据库设计请见概要设计文档八、数据初始化及抢购流程数据初始化及抢购流程九、其他-理财预约投资方案1.1.如何保证公平即先到先得如何保证公平即先到先得采用队列机制:用户发过来请求后先进行过滤,将通过校验的用户请求压入队列。技术选型:技术选

13、型: MQMQ、NMQNMQ、RabbitMQRabbitMQ、利用利用RedisRedis自己实现(自己实现(FIFOFIFO)。)。具体过程如下:当用户(ID为9500088)发来预约投资(ID为2115)1000.35元的请求后,先判断募集投资余额(Redis key rs:pdt:2115 leftq q字段)是否大于请求金额、用户(Redis key rs:xgq q:2115中成员9500088的score )是否达到限购资金2000元。如果以上条件有一项不通过,则预约失败,给出错误提示。否则压入队列lpush rs:que:2115 9500088_1000.35(为防止出队操作

14、有失败的情况,入队操作会适当多放入部分请求,具体数值可以在配置文件中定义,以限制队列长度)。后端起脚本对队列进行处理(lpop rs:que:2115)。rs:pdtrs:pdt:%s :%s /理财产品信息hash hmget/hincrbyfloatrs:xgrs:xg:%s:%s :%s:%s /用户限购信息string incrbyfloat/delrs:xgqrs:xgq:%s :%s /投资队列控制SortedSet zscore/zincrby/zremrs:quers:que:%s :%s /预约投资队列list lpush/lpop/llen九、其他-理财预约投资方案2.2.

15、如何避免预约超发以及实现限购如何避免预约超发以及实现限购按顺序出队列操作(lpop),当处理用户(ID为9500088)的预约投资(ID为2115)1000.35元的请求时,先判断募集投资余额(Redis key rs:pdt:2115 left字段)是否大于请求金额,以及用户(Redis key rs:xg:2115:9500088)是否达到限购资金2000元,如果以上两个条件有一项不通过,则预约失败,给出错误提示。假设以上两个条件均通过校验,且用户余额充足则执行如下Redis事务:multimulti/事务开始hincrbyfloathincrbyfloat rs:pdt:2115 left -1000.35 rs:pdt:2115 left -1000.35/直减募集余额incrbyfloatincrbyfloat rs:xg:2115:9500088 1000.35 rs:xg:2115:9500088 1000.35 /增加用户限购金额saddsadd rs:xg:2115 9500088 rs:xg:2115 9500088/向限购用户集合添加用户用户后续清理execexec/执行事务如果以上事务执行成功后,还需要判断返回值(rs:pdt:2115 left字段是否大于0以及rs:xg:2115:9500088是否大于2000)是否通过校验,如果没通过需

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论