优惠券优惠的思路以及实践
发布时间 - 2026-01-10 22:56:32 点击率:次前言:最近做关于优惠券的开发,但是发现优惠券量大了之后,性能完全跟不上,库中存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生成唯一的促销/优惠/折扣码(附源码)
# 的是
# 就不
# 库中
# 我就
# 就会
# 随机数
# 在这个
# 感兴趣
# 可以通过
# 去看
# 大了
# 只需要
# 可以看出
# 大大的
# 来做
# 其中一个
# 大家一起
# 不加
# 新来
# 之久
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
如何在云虚拟主机上快速搭建个人网站?
浅谈javascript alert和confirm的美化
如何用西部建站助手快速创建专业网站?
微信小程序 配置文件详细介绍
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
SQL查询语句优化的实用方法总结
如何用景安虚拟主机手机版绑定域名建站?
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
如何用好域名打造高点击率的自主建站?
如何用低价快速搭建高质量网站?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
Python自动化办公教程_ExcelWordPDF批量处理案例
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
,在苏州找工作,上哪个网站比较好?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
如何快速搭建高效香港服务器网站?
Laravel怎么使用Intervention Image库处理图片上传和缩放
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
详解Android——蓝牙技术 带你实现终端间数据传输
微信小程序 HTTPS报错整理常见问题及解决方案
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
Android利用动画实现背景逐渐变暗
Laravel如何集成Inertia.js与Vue/React?(安装配置)
网站建设要注意的标准 促进网站用户好感度!
HTML 中动态设置元素 name 属性的正确语法详解
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
iOS中将个别页面强制横屏其他页面竖屏
黑客如何利用漏洞与弱口令入侵网站服务器?
如何为不同团队 ID 动态生成多个非值班状态按钮
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何用已有域名快速搭建网站?
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
如何自定义建站之星模板颜色并下载新样式?
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
浅谈redis在项目中的应用
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
Laravel怎么连接多个数据库_Laravel多数据库连接配置
实例解析angularjs的filter过滤器
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
如何快速打造个性化非模板自助建站?

