首页 > 其他分享 >性能优化实战(四):优惠券派发高并发、防超发设计

性能优化实战(四):优惠券派发高并发、防超发设计

时间:2024-10-17 10:49:15浏览次数:3  
标签:缓存 派发 防超发 DB 用户 计数 优惠券

如果你觉得这篇文章对你有帮助,请不要吝惜你的“关注”、“点赞”、“评价”、“收藏”,你的支持永远是我前进的动力~~~

 个人收藏的技术大会分享PDF文档,欢迎点击下载查看!!!

本文是我在做网易考拉海购性能优化时的真实实践,希望对你也有帮助!!!

一、优惠券的作用

优惠券在电商中扮演着多重角色,其作用主要体现在以下几个方面:

  1. 吸引顾客:通过发放优惠券,电商平台可以吸引新顾客尝试购买,以及激励老顾客再次购买,从而增加网站的流量和转化率。
  2. 促进销售:优惠券能够直接刺激消费者的购买欲望,增加商品的销售量,尤其是在促销活动中,优惠券常常作为推动销售的有效工具。
  3. 清理库存:对于即将过季或滞销的商品,通过优惠券可以更快地清理库存,减少损失。
  4. 用户粘性提升:定期为顾客提供优惠券可以增加顾客对电商平台的忠诚度和粘性,促进重复购买。
  5. 市场调研:通过优惠券的使用情况,电商平台可以收集消费者行为数据,分析顾客偏好,为市场营销策略提供依据。
  6. 价格歧视:优惠券可以实现价格歧视策略,即对不同顾客群体提供不同的价格,最大化收益。
  7. 促销活动宣传:优惠券常常与特定的促销活动相结合,通过优惠券的发放来宣传促销活动,提高活动的知名度和参与度。
  8. 增加购物体验:顾客在享受优惠的同时,也能获得一种购物满足感,这种体验感的提升有助于建立品牌形象。
  9. 数据分析:通过优惠券的使用情况,商家可以分析促销活动的效果,优化未来的营销策略。
  10. 竞争策略:在竞争激烈的电商市场中,优惠券可以作为竞争策略的一部分,帮助商家在价格战中占据有利位置。

总之,优惠券是电商营销组合中的重要组成部分,它通过多种方式促进了电商平台的销售增长和品牌建设。

二、优惠券派发基本流程

基本派发流程基本如下:

  1. 基本信息校验:
  • 参数校验:检查传入的优惠券发放请求是否包含所有必要的信息,如优惠券ID、用户ID、活动ID等,并验证这些信息的格式是否正确。
  • 发放时间校验:确认当前时间是否在优惠券规定的发放时间范围内,确保优惠券只能在特定时间段内领取。
  1. 计数校验:
  • 优惠券总量数:检查已发放的优惠券数量是否已经达到预设的总限量,如果达到或超过,则停止发放。
  • 日限:检查在当前日期内已发放的优惠券数量是否达到日发放上限,以控制每日的优惠券发放量。
  • 单账户限制:确保单个用户账户领取的优惠券数量不超过规定的限制,避免一个用户领取过多优惠券。
  1. 用户类型校验:
  • 会员:检查用户是否为会员,如果是,则根据会员等级或权益决定是否可以领取优惠券。
  • 限定用户领取:根据活动规则,检查用户是否属于特定群体(如新用户、老用户、特定区域的用户等),只有符合条件的用户才能领取。
  1. 风控校验阶段:
  • 风险控制:对用户的行为进行分析,判断是否存在刷券、作弊等异常行为,通过一系列风控规则来决定是否允许用户领取优惠券。
  1. 更新计数:
  • 在确认用户可以领取优惠券后,更新优惠券的发放计数,包括总发放量、日发放量以及用户领取计数,确保数据的准确性。
  1. 派发数据落库:
  • 将优惠券的派发记录保存到数据库中,包括用户ID、优惠券ID、领取时间等信息,以便后续的核销和数据分析。
  1. 异步抄送风控:
  • 将优惠券的派发结果异步发送到风控系统,以便风控系统能够根据最新的数据调整风控策略,进一步提高系统的安全性和稳定性。

整个流程的设计旨在确保优惠券的发放公平、合理,同时防止欺诈行为,保护电商平台的利益。

三、多种方案对比

同一个业务流程,有多种技术实现方案,但都有着各自的优缺点。

我们设计了四种不同的方案及其优缺点。具体如下:

  1. 常规数据库计数 - DB全搞定
  • 优点:实现简单,数据不会丢,一致性好
  • 缺点:热点严重,难以支撑较高派发量
  1. DB分片计数:为了解决热点,我们又设计了DB分片计数的方案
  • 优点:计数及时落库,一定程度上解决了热点问题
  • 缺点:临界点难以处理,需要动态调整
  1. 缓存计数,定期统计DB并修正缓存计数
  • 优点:消除了DB热点,并发高
  • 缺点:缓存失效会导致超发,不能清理派发数据
  1. 缓存计数 + DB记录增减流水 - 促销现用的方案
  • 优点:消除了DB热点,并发高
  • 缺点:需要占用额外的DB空间,难以防止超发
  1. 黑科技:AIISQL/MySQL线程池/合并提交
  • 优点:可以提供上万的TPS(每秒事务数)
  • 缺点:考拉渴望而不可求

四、网易考拉海购的方案

为了应对网易考拉海购的高并发场景,同时又要防超发,我们最终设计了如下的方案,结合了DB和缓存的特性,达到了高并发及防超发的目的。

我们的目标是结合各方案的优点:

  1. 支持高并发
  2. 缓存计数
  3. DB分片计数
  4. 处理好临界点

但又有我们自己的技术要求,既要满足业务的需要不超发,又不能实现过于复杂

  1. 不要超发
  2. 不要丢派发计数
  3. 不要复杂的调整逻辑
  4. 不要插流水

最终我们通过redis lua脚本保证缓存操作原子性

缓存不存在时,利用异步、加锁,单线程从DB中统计已派发计数回填缓存

派发计数分片存储,可以派发时,随机选一个分片更新,无事务

标签:缓存,派发,防超发,DB,用户,计数,优惠券
From: https://blog.csdn.net/u013469646/article/details/142752013

相关文章

  • 优惠券秒杀模块方案设计
    本文章针对优惠券秒杀场景所进行的方案设计,考虑不周的地方,烦请指正。在我们兑换/秒杀优惠券模板的接口中,可能会存在以下三个难点:-高并发流量压力:秒杀活动往往会瞬间吸引大量用户访问系统,导致流量骤增,如果直接访问数据库,可能会让数据库负载过重,甚至导致宕机。-库存超卖问题:由......
  • 如何搭建带优惠券插件的陪玩系统
    搭建一个带优惠券插件的陪玩系统,需要综合考虑系统架构设计、功能模块实现以及优惠券插件的集成。以下是一个详细的搭建步骤和关键点:一、前期准备1.明确目标和需求目标用户:确定陪玩系统的目标用户群体,如游戏玩家、技能服务需求者等。功能需求:除了基本的陪玩功能(用户注册与管......
  • 适合初学者的[JAVA]:Redis(2:I/O多路复用模型与事件派发)
    目录说明前言I/O多路复用模型备注:用户空间和内核空间:备注:阻塞IO:(了解)非阻塞IO:(了解)IO多路复用:(重点)常见的方式有:差异:事件派发说明:Redis网络模型总结: 说明本文适合刚刚学习Java的初学者,也可以当成阿岩~的随手笔记.接下来就请道友们和我一起来......
  • 一次性下发100w的优惠券/短信/二维码,兼顾线程池参数可配置 在Spring 中 ThreadPoolTas
    一次性下发100w的优惠券/短信/二维码,兼顾线程池参数可配置在Spring中ThreadPoolTaskExecutor的使用1、场景需求分析针对6.18,11.11这种场景,平台一次性发布500w张优惠券,或者对于锁单用户统一发下100w张确认信息,同时我们平时有抢购茅台的场景,京东一次性发布10w个验证码,主要是针......
  • 【产品经理修炼之道】- 优惠券系统从入门到精通(五十四)
    1Scenario场景电商系统的促销手段(ElectronicCommerceSystems):优惠券拼团砍价老带新优惠券的种类满减券直减券折扣券优惠券系统的核心流程发券发券的方式:同步发送or异步发送领券谁能领?所有用户or指定的用户领取上限一个优惠券最多能领取多少张?领取方式用户主动......
  • 【产品经理修炼之道】- 优惠券系统从入门到精通(五十七)
    优惠券营销:两方面提高优惠券使用率优惠券的使用非常广泛,从线下门店到线上电商,尤其是电商、o2o、金融理财等行业经常使用到优惠券的。但并不是每一个商家的优惠券都能激发用户的兴趣,有的优惠券使用率很高,有的则是极低;那么如何借助运营手段来提高优惠券的使用率呢?优惠券的......
  • 【产品经理修炼之道】- 优惠券系统从入门到精通(三十四)
    每天都在用优惠券,可是优惠券到底是什么因为工作的原因,两年来我几乎每天都在跟优惠券打交道。大概我的同事们都被问到过这个问题吧:“听说你在XX工作,来张券呀~”然后友谊的小船说翻就翻~~大雾优惠券的本质是价格歧视优惠券起源于19世纪20年代,至今在大多数情况下仍然是让消......
  • 【产品经理修炼之道】- 优惠券系统从入门到精通(四十五)
    在高并发情况下我是这样解决单用户超领优惠券问题问题抛出在近期的项目里面有一个功能是领取优惠券的功能,问题描述:每一个优惠券一共发行多少张,每个用户可以领取多少张:如:A优惠券一共发行120张,每一个用户可以领取140张,当一个用户领取优惠券成功的时候,把领取的记录写入到另......
  • 如何确保100万张优惠券无遗漏地发放给用户:Java实现策略
    在数字化营销中,优惠券的发放是一项常见且重要的活动。当面临发放大量优惠券(如100万张)的挑战时,确保每一张优惠券都能准确无误地发放到目标用户手中,就显得尤为重要。以下是一个基于Java实现的策略,旨在帮助你高效、安全地完成这一任务。1.设计优惠券系统1.1数据库设计首先......
  • 100万用户,抢10万优惠券,如何设计?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......