前言

秒杀场景在生活中几乎随处可见, 不论是商品抢购、春运抢票还是一个随处可见的红包, 都会涉及到秒杀的场景. 在面试中, 秒杀业务的设计也成为热门题目为面试官和应聘者津津乐道.

接下来, 本文将针对秒杀场景中的抢红包实现方案进行分享, 包括红包业务常见的实现方案, 瓶颈及优化.

分析

场景

红包的应用场景有很多, 如随机红包、定额红包等, 甚至还有结合其他促销业务的红包变种如抢购物津贴等. 但从技术的角度来看, 不论玩法有多少变化, 其核心都是相似的:

  • 稳定: 扛得住突发的大流量, 确保红包都能成功派发.
  • 准确: 数据一定要正确, 不能出现超额派发的情况.

业务

抢红包可能会由于业务需求不同而产生很多变种, 设计上要足够抽象, 不能为了抢现金红包和抢购物津贴红包写多份相似的代码. 抢到红包的后置操作可以作为消息, 由不同的业务模块自行处理.

技术

抢红包核心业务不复杂, 其关键点在于应对高并发、资源争用等.

  • 高并发: 异步、横向扩展负载均衡、限流等.
  • 读多写少: 缓存.
  • 资源争用: 原子操作, 缓存或数据库等层面可进行控制. 如使用Lua脚本进行减库存操作.

方案一 —— 预分配

适用场景

红包数量相对合理, 很少产生库存剩余的情况、用户量级不大的情况.

  • 优势: 实现简单、配合缓存很容易应对高并发
  • 不足: 频繁发放较多数量大的红包会导致一次性写入大量分配记录, 如果领取的人不多, 会产生很多无效数据.

简要描述

预分配是在发放红包时, 根据红包总额和数量、按照既定算法进行分配, 提前创建好全部的红包分配记录. 领取时只是将红包分配记录进行更新.

比较适合系统发放的红包(面向某一标签的全部用户群体, 发出的红包基本会被领取完), 不适合用户群组红包(无法控制领取红包人数, 当红包个数远大于群组人数的情况下, 无效数据比较多, 比如在一个10人群组发放一个数量为1000的红包).

实现细节

流程

  • 在红包开抢前, 预先分配好红包领取记录, 领取记录的用户ID为负值.
  • 开抢后, 开放唯一领取红包的入口
  • 领取操作核心就是更新红包分配记录:
-- 此处划重点 ( ̄▽ ̄)"UPDATE IGNORE record SET user_id = {userId}, gmt_receive = UNIX_TIMESTAMP() WHERE red_envelop_id = 1 AND user_id < 0 LIMIT 1;-- red_envelop_id + user_id 有唯一约束

红包发放记录

ID 总金额 数量 ... 1 100 3 ... 红包分配记录

unique: 红包ID+领取用户ID

  • UPDATE IGNORE ... LIMIT 1 : 解决了资源争用问题, 确保并发请求下红包的领取的数据正确性.
  • red_envelop_id + user_id : 创建索引并唯一约束, 确保对于同一个红包同一用户只能领取一次.
  • 预分配的user_id为负值: 因为red_envelop_id + user_id 有唯一约束.
  • 对于一般流量的小型活动, 这种方式实现简单、成本低, 不引入缓存的情况下只用一个MySQL基本也能扛得住.

方案二 —— 实时分配

适用场景

领取人数无法估计、频发退款, 如群组红包(经常发生剩余退款)

实现细节

流程

  • 开抢前将红包信息加载到缓存, 首次加载时间可长一些
  • 抢红包: 从缓存读取(没有则加载), 分配红包后原子更新缓存(若已发放完毕则直接返回失败)
  • 缓存更新后写入数据库(校验数据正确性)

红包发放记录

unique: 红包ID+领取用户ID

  • 首次缓存加载时间要稍长一点: 红包刚开始发放时可能会有较大的突发流量, 此时去DB加载缓存不合适.
  • 缓存可以不用和数据库保证强一致: 数据的正确性由数据库进行维护, 如: 缓存扣除了红包额度, 但更新数据库时发生了异常, 此时缓存不需要回滚, 待缓存失效后重新加载即可.(所以缓存时间可以是几秒钟, 不用太长)
  • 更新缓存可以考虑使用Lua脚本以保证原子性.
  • 实时分配红包不会产生无效的记录, 适合大多数场景, 但实现比预分配复杂的多.

细节及优化

  • 客户端点击频率控制能在一定程度上减少流量.
  • 红包领光后在缓存一层拦截掉全部请求, 直接返回失败.
  • 网关层进行限流.

结语

秒杀场景其特点是高并发、读多写少、资源争用, 每一个点都需要根据其业务场景选择适合的解决方案, 如使用缓存解决频繁读取的问题、使用队列解决数据库性能瓶颈等.

对于抢红包业务来说, 预分配和实时分配都是行之有效的方案, 各有优劣, 具体选择哪种, 还是要看业务需求.

如果这篇文章对您有帮助,请点个赞吧 ( ̄▽ ̄)"

原文:https://blog.piaoruiqing.com/blog

数据库并发抢红包_秒杀场景实践之抢红包相关推荐

  1. 秒杀场景实践之抢红包 —— 常用解决方案

    秒杀场景实践之抢红包 -- 常用解决方案 秒杀场景实践之抢红包常用解决方案 文章地址: https://blog.piaoruiqing.com/blog/2019/09/01/秒杀场景实践之抢红包一 ...

  2. mysql去掉秒杀场景_秒杀场景下mysql减库存逻辑优化

    [问题背景] 某天早上做活动,流量大量增长,导致大量更新库存操作失败. 操作mysql返回的错误均为"Lost Connection to mysql server",即mysql ...

  3. php 抢红包_用PHP实现的抢红包小程序

    最近有点懒,不怎么更新,平时事情比较多,加之周末要去锻炼打球赛所以才拖了那么久.闲话少说,上干货!! 首先这个程序已经不是什么新鲜的东西了,早在微信出抢红包功能的时候就有了,不过让我想写这篇文章的原因 ...

  4. 数据库并发抢红包_微信高并发抢红包秒杀实战案例

    前言 群里有小伙伴咨询微信红包的架构,对于我来说,显然是不知道的,但是写一个相对高并发的抢红包案例还是完全可以的. 架构设计 业务流程老板发红包,此时缓存初始化红包个数,红包金额(单位分),并异步入库 ...

  5. 阿里、百度、美团都在用的‘’高并发秒杀系统‘’;抢红包、秒杀活动、微博热搜、12306抢票等高并发场景

    "秒杀活动"."抢红包"."微博热搜"."12306抢票"."共享单车拉新"等都是高并发的典型业务场 ...

  6. kafka mysql秒杀框架_一次模拟简单秒杀场景的实践 Docker Node.js Kafka Redis MySQL...

    秒杀活动可以说在互联网上随处可见,从12306抢票,到聚划算抢购,我们生活的方方面面都可以看到秒杀的身影.秒杀的架构设计也是对于一个架构师架构设计能力的一次考验.本文的目的并不在于提供一个可以直接落地 ...

  7. Redis 学习笔记-NoSQL数据库 常用五大数据类型 Redis配置文件介绍 Redis的发布和订阅 Redis_事务_锁机制_秒杀 Redis应用问题解决 分布式锁

    1.NoSQL数据库 1.1 NoSQL数据库概述 NoSQL(NosQL = Not Only sQL ),意即"不仅仅是sQL",泛指非关系型的数据库.NoSQL不依赖业务逻辑 ...

  8. mysql数据库行业应用_腾讯云发布MySQL 8.0数据库 可应用至更多行业场景

    原标题:腾讯云发布MySQL 8.0数据库 可应用至更多行业场景 来源:21财经 目前,腾讯云数据库已有20多种数据库服务,包括云数据库MySQL.云原生数据库CynosDB.数据库智能管家DBbra ...

  9. mysql并发量_高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

    推荐阅读: 学会这些微服务+Tomcat+NGINX+MySQL+Redis,再去面试阿里P7岗吧 "火爆"的微服务架构你还不会?从基础到原理的PDF文档快来学! Nginx负载均 ...

最新文章

  1. 即构推出小程序连麦直播方案,与iOSAndroid APP互通连麦!
  2. 妇女在IT安全工作人员当中的比例只有10%
  3. 通过nodejs插入删除MongoDB数据
  4. redis缓存架构-02-两种持久化机制(RDB和AOF)
  5. CSS基础学习-6.CSS属性_列表、表格
  6. 12、java中的I/O流(2)
  7. R语言安装;Rstudio安装
  8. mysql 索引的简单使用
  9. CNN 模型框架(转)
  10. 【开源项目12】Retrofit – Java(Android) 的REST 接口封装类库
  11. [转]ASP.NET网页请求以及处理全过程(反编译工具查看源代码)
  12. oracle数据库如何写翻页_ORACLE翻页SQL语句
  13. 给老板汇报技术规划的一些要点(转)
  14. C语言符号意思(看了必懂系列)
  15. 【嵌入式算法】CRC校验算法
  16. 昆仑通态通用版找不到驱动_昆仑通态无法连接1200
  17. 计算机专业毕业答辩ppt优秀范例,毕业论文答辩PPT模板优秀范例课件.ppt
  18. shell脚本复制文件
  19. linux怎样压缩文件夹加密文件,linux下文件加密压缩和解压的方法
  20. 小米机型安全删除内置软件列表 miui12 miui13 可删除内置

热门文章

  1. 不可求的电脑上必备软件,你也许听过
  2. apache tomcat (catalina)查版本(solaris/unix)
  3. 如果没有Visual Studio 2015,我们如何创建.NET Core项目 ?
  4. MBG配置详解及最佳实践
  5. jquerymobile 基础教程
  6. vi 编辑意外中断处理办法
  7. python假设有三个列表_python基础三(列表和元组)
  8. dreamcast游戏_《Dreamcast Collection》开箱及游戏介绍
  9. 链接oracle 灾难性故障,打开计划任务的时候出现灾难性故障.
  10. Vue之单文件组件和脚手架