高并发系统设计 -- 抢红包设计

news2024/12/23 8:56:37

抢红包的业务分析

在这里插入图片描述

可以明显的看到打开了红包不一定可以抢到。这样做的好处是:

  • 符合现实生活逻辑,有仪式感
  • 防止误领,发现不对劲可以马上退出
  • 流程拆的长一些,平摊高并发下的压力

在这里插入图片描述

预拆包:我在发红包的时候,就已经把所有的东西都计算好了放在redis里面了。

实时计算:在抢红包的时候进行现场计算。

我选择的时把红包提前拆好,虽然提前拆好需要占用Redis的一些存储,但是这样可以让抢红包的速度到达最快。

发红包

发红包的时候需要一些算法,这里采用的是二倍均值法

二倍均值法可以在正态分布的前提下做到抢红包相对的公平。计算方法如下:

每次抢到的金额 = 随机区间(0, M/N*2)。

在这里插入图片描述

发红包的时候需要指定红包的金额和个数。然后通过二倍均值法计算后放入Redis。这里我们采用的数据结构是List类型,因为List抢走一个红包和红包库存呢减一是一个原子性操作。而且List类型的数据结构就决定了获取库存的时间复杂度是O(1),是可行的。到时候按照顺序弹出即可。

在这里插入图片描述

拆红包

用户点击红包的时候查看库存,如果库存为0的话直接显示红包已经抢完了,并且把详细信息显示。如果还有库存的话,就可以进入抢红包的环节了。

抢红包

用户点击抢红包,此时再次判断库存是否充足,如果充足的话判断用户是否抢过红包,如果两个条件都满足的话,就抢红包成功,从Redis里面弹出一个红包给用户,更新对应的Redis(红包总金额要扣除了),然后使用消息队列异步的调用服务,将用户的金额进行相应的加上。

在这里插入图片描述

与此同时,需要记录哪些用户已经抢过红包了。

在这里插入图片描述

退款

使用延迟队列,24小时后进行消息的消费,如果发现数据库里面还有相应的缓存,那么就需要把剩下的金额退还给用户。具体过程是查看Redis的某个key是否还存在。如果还存在的话那么就把List里面的红包全部弹出,然后把金额归还给用户。然后把红包key删除掉。

高并发场景下可能会遇到的问题

超卖问题

因为查看是否还有库存扣减库(抢红包)存两个操作不是原子性的,因此我们可以使用Redis+Lua实现原子性操作。

Lua实现抢红包的流程:

  • 查询用户是否抢过红包
  • 查询是否还有红包
  • 有的话就扣减红包Redis弹出一个
  • 没有的话就返回

使用 EVAL 命令每次请求都需要传输 Lua 脚本 ,若 Lua 脚本过长,不仅会消耗网络带宽,而且也会对 Redis 的性能造成一定的影响。

思路是先将 Lua 脚本先缓存起来 , 返回给客户端 Lua 脚本的 sha1 摘要。 客户端存储脚本的 sha1 摘要 ,每次请求执行 EVALSHA 命令即可。

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ansible的静态清单配置文件

清单文件 定义主机清单文件 清单中定义ansible将要管理的一批主机,这些主机也可以分配到组中,以进行集中管理。组中也可以包含子组,一台主机也可以是多个组中的成员。清单还可以设置应用到它所定义的主机和组的变量。 编写主机清单文件 主机…

归置归置,我的 2022

J3code杂文(程序人生 # 年终总结) 记得 2021 年我没有进行年终总结,也就没有发出过相关的内容出来。总结原因就是一个,躺平了,自毕业换工作之后,就一直在适应工作环境与生活环境中默默的度过了 2021 年。 …

你真的懂树吗?二叉树、AVL平衡二叉树、伸展树、B-树和B+树原理和实现代码详解...

树(Tree)是一种相当灵活的数据结构(上一节已经详细讲解了基本的数据结构:线性表、栈和队列),你可能接触过二叉树,但是树的使用并不限于此,从简单的使用二叉树进行数据排序&#xff0…

(深度学习快速入门)第三章第一节:多层感知器简介

文章目录一:引入二:定义三:反向传播算法四:构建多层感知器完成波士顿房价预测一:引入 前文所讲到的波士顿房价预测案例中,涉及到的仅仅是一个非常简单的神经网络,它只含有输入层和输出层 但观…

vue3 antd项目实战——Form表单的重置与清空【resetFields重置表单未生效(手写重置函数)】

vue3 antd项目实战——resetFields重置表单无效【手写重置函数重置表单数据】关于form表单的文章合集场景复现原因分析解决方案(手写清空函数)关于form表单的文章合集 文章内容文章链接Form表单提交和校验https://blog.csdn.net/XSL_HR/article/details/128495087?spm1001.20…

面向对象定义一个hero类

问题定义一个hero类,属性有power,name,分别代表体力值和英雄的名字,体力值默认为100;方法有:1.行走的方法如果体力值为0,则输出不能行走,此英雌已死亡的信息;2.吃的方法&…

双非二本、已获HCIA认证的大二学生与C站相遇的2022

目录 前言 2022年1月、2月——迷茫 2022年3月~6月——调整规划 ​2022年7月——在CSDN发布第一篇博客 2022年8月——步入正轨,获得2022谷歌开发者大会入场名额 2022年9月~10月——开学季,收获季 2022年11月——第一次接触项目并去公司学习实践&…

01通信/协议一些简要概念

通信的目的 将一个设备的数据传送到另一个设备,扩展硬件系统。 通信协议 制定通信的规则,通信双方按照协议规则进行数据收发。 每一种通讯协议都有硬件与软件上的要求。 常见的协议 USART TX、RX 全双工 异步 单端 点对点 I2C SCL、SDA 半双…

百度大规模知识图谱构建及技术应用实践

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点罗振宇2023年跨年演讲PPT原稿2023年,如何科学制定年度规划?《底层逻辑》高清配图‍基于深度学习的个性化推荐系统实时化改造与…

【Node.js实战】一文带你开发博客项目之登录(对接完毕,cookie、session、redis各司其职)

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端 📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀未…

【蓝桥杯选拔赛真题54】Scratch小猫钓鱼 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

目录 scratch小猫钓鱼 一、题目要求 编程实现 二、案例分析 1、角色分析

河道船只识别系统 yolov5

河道船只识别系统通过Python基于YOLOv5深度学习框架模型技术对画面中船只进行监测,如识别到有船只违规行为,立即抓拍告警同步回传给平台。YOLOv5是一种单阶段目标检测算法,该算法在YOLOv4的基础上添加了一些新的改进思路,使其速度…

写了个自动巡检多个接口地址的脚本!

作者:JackTian 来源:公众号「杰哥的IT之旅」 ID:Jake_Internet 转载请联系授权(微信ID:Hc220088) 原文链接:写了个自动巡检多个接口地址的脚本! 没错,这次我结合工作运用…

【C语言】你对动态内存分配有多少了解呢

🏖️作者:malloc不出对象 ⛺专栏:《初识C语言》 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录前言一、什么是动态内存分配二、为什…

SpringBoot(二)【学习笔记】

SpringBoot的配置文件 之前SSM项目: 每一个框架都有自己的配置文件, 每一个配置文件头文件不一样, 需要找到每个框架的头文件 SpringBoot的配置文件: 所有的框架的配置项,都可以在application.properties文件配置, 如果自定义一些配置, 修改SpringBoot默认的配置项, 可以在appl…

JAVA语言程序设计基础入门技术教程

JAVA语言程序设计基础 第一章:JAVA入门基础–开山篇 视频:https://edu.csdn.net/course/detail/8034 前言:什么是java 是咖啡飘香的清晨是斯坦福校园意浓情深是James的思想睿智是剁手党双十一挥舞的利刃是大数据服务的平台是春运时节那期…

Java高手速成│实战:应用数据库和GUI开发产品销售管理软件(1)

实战项目:应用数据库和GUI开发产品销售管理软件 01、项目分析 应用各种数据库编程技术,并利用GUI组件,例如按钮、标签、文本字段提供增添、更新、删除产品销售记录等功能。利用JTable显示产品销售数据表中的记录。图1显示了这个实战项目的典…

【目标检测】FPN网络全解

目录:FPN网络详解一、引言二、论文概述2.1 图像金字塔2.2 为什么需要构造特征金字塔三、论文详解四、FPN框架解析五、为什么FPN能够很好的处理小目标?六、FPN总结一、引言 这篇论文是CVPR2017年的文章,采用特征金字塔做目标检测,…

让程序“说话”pyttsx3模块

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 让程序“说话” pyttsx3模块 选择题 关于下列代码说法错误的是? import pyttsx3 enginepyttsx3.init() engine.setProperty(rate,180) engine.say(我喜欢学习python数据分析&#x…

统信软件根社区斩获CSDN两项大奖

在CSDN 2022中国开发者影响力盛典中,统信软件根社区凭借多年的深耕与投入以及社区影响力,荣获CSDN 2022年度开发者社区;旗下社区发行版deepin荣获CSDN 2022年度开源影响力项目。 CSDN颁奖现场 “CSDN 2022 中国开发者影响力年度评选”自 20…