全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

优惠券优惠的思路以及实践

前言:最近做关于优惠券的开发,但是发现优惠券量大了之后,性能完全跟不上,库中存200万条优惠券,发一张券竟然需要5分钟之久,然后我就着手优化,最终到发一张券只需要15毫秒左右,现在把整个思路以及代码贴出来,供大家一起讨论和学习。

简介

主要实现优惠券促销活动,首先创建活动,然后创建券组,采用预处理的方式提前进行制券,在第一版本主要实现,功能的基本业务。然后在分支实现,大数量和高并发问题。

分支1.1

1:解决优惠券编码重复问题,原先采用的是获取数据库所有的券,然后去比对是否重复,如果库数据量达百万的时候就会出现非常缓慢,而且会 出现经常制券失败等,所以此版本舍弃原先采用随机数的模式,通过推特的雪花算法来避免唯一,但是依然保留优惠券前缀和后缀。

2:由原来的异步采用线程修改为线程池,以为高并发时候存在大量的线程占内存空间。

3:由原来制券采用for循环模式修改为批量制券,而且采用分配插入优惠券,一批次目前定为5000.

4:加入消息队列(采用rabbitMQ)对于某一批次添加失败,把失败的放入对列中,通过队列进行补救,已到达高可用。避免大批量优惠券来回重新导入 消息队列对于异常信息拒绝解决并重返消息队列中,配置2个消费者以避免其中一个服务异常,消息处理出现死循环

分支1.2

1:加入操作日志

目的:跟踪热点数据,查询日志快速跟踪应用程序中的慢查询或慢操作,为后面的优化奠定基础

2:加入异常日志

目的:快速的获取线程的异常问题,通过日志中的数据能快速修改

3:采用技术 通过aop和rabbitmq中间件来做,这样减少由于日志问题给程序带来的效率问题

未做优化效率统计

采用数据库mysql

数据:添加25个有效活动,每个活动下分别有2个券组,每个券组下制券是5万张。优惠券表中250万条记录

业务:一个会员消费同时满足这25个活动要送50张优惠券。

统计:整个发券过程经过10次统计得出大约消耗是306s,其中每次获取优惠券耗时6s。如果多次循环必然带来性能的瓶颈

更新优惠券状态大约耗时是0.5s,从上我们可以看出我们的性能问题主要出在获取优惠券上。所以才1.3版本主要通过程序来解决这个问题

分支1.3

目的:通过程序代码和优化数据库来提高性能

具体方案:

1:以前获取券组下所有的优惠券现在修改为每次只获取100条(经测试统计得出发送50张券消耗时间是106s,每次获取优惠券大约耗时是2s多,整体性能提升近3倍)

2:优化sql,加入组合索引(统计得出发送50张优惠券消耗总时间是2.5s,每次获取优惠券大约耗时是0.015s,整体的性能提升了近42倍)

3:加入本地缓存(如果一次性获取的优惠券先放入map中,那么下次如果还有就不需要从库中获取优惠券。统计发现:10件商品,每件商品发50张优惠券

不加本地缓存效率耗时是7.5s,加入本地缓存后耗时约5.5s,整体性能提升了2s)

效果分析:

4:对于发券采用批量更新来替代for循环(由上面的约5.5s性能提升为大约4.8s)

分支1.4

目的:通过异步和消息队列来进行发券

具体方案:

1:通过异步进行发券,这样可以提高cpu的利用率,同时通过消息队列来保证稳定性,避免出现异常导致返回前端发券成功,但是异步制券时候出现异常在发500张优惠券的时候效率大约提升了0.5s

2:对代码进行一次重构

原则:把大方法修改小方法,每个小方法处理一个业务,比如获取活动,那么这个方法的职责就是获取活动,同时每个小方法尽量有返回值,这样可以增加代码的可读性

分支1.5

1:采用redis做缓存,取当天有效的活动,活动下券组,券组下500张券存入缓存中。

2:加入定时任务,在每天12点时候更新缓存(这个时间可以通过热点数据来监控)

3:统计结果发现:

加入缓存后发送500张优惠券耗时只有2.7s,比之前的4.8s快了2.1s,大大的提升了性能

总结:代码我就不贴,大家可以自己去看。感兴趣的朋友可以在这个基础继续研发学习。在版本1.6可能加入分库分表,目前想采用的是当当的sharding-jdbc

源码地址

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# 优惠券实现思路  # 优惠券  # 使用Nopcommerce为商城添加满XX减XX优惠券功能  # PHP生成唯一的促销/优惠/折扣码(附源码)  # 的是  # 就不  # 库中  # 我就  # 就会  # 随机数  # 在这个  # 感兴趣  # 可以通过  # 去看  # 大了  # 只需要  # 可以看出  # 大大的  # 来做  # 其中一个  # 大家一起  # 不加  # 新来  # 之久 


相关文章: 如何通过cPanel快速搭建网站?  如何用5美元大硬盘VPS安全高效搭建个人网站?  清除minerd进程的简单方法  香港服务器如何优化才能显著提升网站加载速度?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  如何通过商城自助建站源码实现零基础高效建站?  高端企业智能建站程序:SEO优化与响应式模板定制开发  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  建站ABC备案流程中有哪些关键注意事项?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  建站之星微信建站一键生成小程序+多端营销系统  小程序网站制作需要准备什么资料,如何制作小程序?  如何做静态网页,sublimetext3.0制作静态网页?  如何快速搭建二级域名独立网站?  深入理解Android中的xmlns:tools属性  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何选择美橙互联多站合一建站方案?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  C++用Dijkstra(迪杰斯特拉)算法求最短路径  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何在阿里云香港服务器快速搭建网站?  建站之星代理费用多少?最新价格详情介绍  设计网站制作公司有哪些,制作网页教程?  如何用y主机助手快速搭建网站?  教程网站设计制作软件,怎么创建自己的一个网站?  建站之星安装后如何自定义网站颜色与字体?  网站代码制作软件有哪些,如何生成自己网站的代码?  如何做网站制作流程,*游戏网站怎么搭建?  如何选择建站程序?包含哪些必备功能与类型?  如何在IIS服务器上快速部署高效网站?  网站制作公司,橙子建站是合法的吗?  北京的网站制作公司有哪些,哪个视频网站最好?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  无锡营销型网站制作公司,无锡网选车牌流程?  如何选择高效便捷的WAP商城建站系统?  如何通过虚拟机搭建网站?详细步骤解析  如何有效防御Web建站篡改攻击?  如何构建满足综合性能需求的优质建站方案?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  如何通过西部数码建站助手快速创建专业网站?  建站之星代理商如何保障技术支持与售后服务?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  建站主机空间推荐 高性价比配置与快速部署方案解析  如何用虚拟主机快速搭建网站?详细步骤解析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。