分布式环境并发场景下,如何操作抢红包(或者减少库存)
文章目录
- 简介
- 思考
- lua 对 redis 的原子操作
- 其他解决方式
- 一些问题
简介
在分布式场景高并发环境中,无论是抢红包还是减库存,其实本质上都是如何处理高并发中共享资源的问题,保证高并发资源分配的安全性
相互学习,如有错误还请指正~
思考
比如抢红包的场景,高并发访问数据库会给 mysql 带来较大压力,因此可以考虑把红包数据放在 redis 中,通过并发请求 redis 内存的红包数据,来快速响应请求
但是大量请求并发访问 redis 内存数据,如何保证这个资源的安全性呢?肯定要用到锁或者进行某种原子操作
lua 对 redis 的原子操作
逻辑思路:
- 首先红包创建的时候,它会对应一个红包 id,创建时候预先知道它要分 10 个红包,那么就把总金额随机分成 10 个数字的数组预先 random 出来
- 然后把红包 id 对应的金额数组,和红包 id 对应的 10 这个库存存到 redis 中,方便后续请求直接访问 redis
- 注意 redis 中还需要维护一个 hashmap 用来判定一个用户是否领取过红包,如果用于领取过就把 userId 存进 map
- 当多个请求并发进来(这里使用 lua 原子操作,保证线程安全)
- 判定用户是否领过:线程 A 会线判定 map 中用户是否领取过,如果领取过直接返回,如果没有领取过就开始判定库存
- 判定库存是否充足:如果库存 <= 0,那么直接返回红包被抢光,如果库存 > 0,就把库存减少一,然后 map 中添加上当前 userId,金额 list 弹出一个红包金额
- 判定如果 redis 中库存为 0 就需要写入库存(同时需要考虑到红包可能还有剩余,因此也需要有一种定时机制把 redis 红包领取记录同步到 mysql)
- 后续业务操作
- 最终把金额 list 弹出的金额返回给前端
其他解决方式
-
分布式锁
对于一些大型打公司可能有分布式锁调用的以来包,这样写起来比较方便
操作:先把红包库存数据导到 redis 中,然后兵法请求过来查询 redis,在查询前先有分布式锁的代码来看是否要阻塞,如果阻塞,等在运行的运行玩之后释放就可以了,锁住的内容包括查询 redis 红包库存是否充足,以及 redis 内存中改库存的操作。锁释放之后,可以判定红包库存如果为 0 就把 redis 记录同步到 mysql 中(也需要有一种定制机制定时同步 redis 到 mysql,因为可能存在红包领取不完),再可以进行后续业务操作。分布式锁里头的实现本质也是用了 lua 脚本保证 redis 多个操作的原子性
特点:万一某个 server 实例宕机了,锁就没法释放,其他人就用抢红包锁住了,所以需要设置一个分布式锁的超时时间
-
悲观锁:(不推荐,但是实际企业开发中可能有人在用)
实际开发中,偷懒的程序员可能比较喜欢用,因为也最简单方便
操作:其实就是事务操作中,进行 select for update(它只能在事务中使用)先锁住数据,直到事务提交才会释放锁
特点:没有解决大量请求打向 mysql 的问题,而且完全串行执行性能很差,还需要注意一旦索引失效,行级锁就变成了表级锁(其他操作表里其他数据的操作也被锁住了)
-
乐观锁
操作:为了解决悲观锁效率问题,使用乐观锁,即 A 线程先看下版本号为 1,这个时候把 mysql 红包库存 - 1 且判定条件是 version == 1,但是突然发现 version == 2 了,这是因为有线程 B 并发执行完了并且把 version 再 ++ 了,这时候 A 线程执行数据库失败,返回 err 给到用户,并且线程 A 事务会回滚,这会到大量失败,并且大量回归操作也给 mysql 带来压力,但我们可以再稍微优化一下,就是引入重试机制,如果线程 A 操作数据库更新失败了,按照限定时间内重试或者设置重试次数,这样可以减少很多用户抢红包(扣库存)失败的返回
特点:适合更新的并发操作不多的场景。存在出现部分并发用户被返回数据库操作 err 的情况
一些问题
- 数据怎么从 mysql 存入到 redis 呢?
对于促销来讲,我们再开发一个定时任务,把符合秒杀促销条件的商品存储到 redis 中,促销前定时执行触发。对于抢红包场景,原代码中加上,当用户创建出红包的时候,就把红包库存以及红包 random 金额数组存储到 redis 中 - 什么场景会去查找 redis 而不是直接访问 mysql 呢?
高并发访问数据库时候考虑上层加一个 redis - redis 如和同步到 mysql?什么时机
可以通过定时任务方式定时同步到 mysql
相关文章:
分布式环境并发场景下,如何操作抢红包(或者减少库存)
文章目录简介思考lua 对 redis 的原子操作其他解决方式一些问题简介 在分布式场景高并发环境中,无论是抢红包还是减库存,其实本质上都是如何处理高并发中共享资源的问题,保证高并发资源分配的安全性 相互学习,如有错误还请指正&…...
明星的孩子也在做的感统训练,真的有用吗?
林志颖曾经在社交网站晒过带他儿子“模拟过山车”的视频。孩子大脑前庭受到适当的刺激,可以有效地锻炼前庭平衡感。 除此之外,还能看见地上的感统教具:过河石、平衡桥,看来明星老爸在陪孩子做感统游戏的日常一点也不含糊。 其实在…...
守护进程与TCP通讯
目录 一.守护进程 1.1进程组与会画 1.2守护进程 二.创建守护进程 setsid函数: 三. TCP通讯流程 3.1三次握手: 3.2 数据传输的过程 3.3四次挥手 一.守护进程 1.1进程组与会画 进程组:进程组由一个进程或者多个进程组成,每…...
在线文本翻译能力新增14个直译模型,打造以中文为轴心语言的翻译系统
经济全球化的今天,人们在工作和生活中经常会与外语打交道。相较传播性较广的英语而言,其他语种的识别和阅读对大多数人来说是一件难事,此时就需要借助语言翻译软件来帮助理解。 华为 HMS Core 机器学习服务(ML Kit)翻…...
CVE-2022-42889 Apache Commons Text 漏洞
0x00 前言 所幸遇到,就简单看看,其中没有啥比较难的地方,仅做记录。10月13日的漏洞。 cve链接可以看下面这个: https://cve.mitre.org/cgi-bin/cvename.cgi?nameCVE-2022-42889 git地址: https://github.com/apache…...
20- widedeep及函数式构建模型 (TensorFlow系列) (深度学习)
知识要点 wide&deep: 模型构建中, 卷积后数据和原始数据结合进行输出.fetch_california_housing:加利福尼亚的房价数据,总计20640个样本,每个样本8个属性表示,以及房价作为target,所有属性值均为number࿰…...
大家一起做测试的,凭什么你现在拿20k,我却还只有10k?...
最近我发现一个神奇的事情,我一个97年的朋友居然已经当上了测试项目组长,据我所知他去年还是在深圳的一家创业公司做苦逼的测试狗,短短8个月,到底发生了什么? 于是我立刻私聊他八卦一番。 原来他所在的公司最近正在裁…...
>>数据管理:DAMA简介「考试和续期」
关于DAMA,这里就不再多做描述,可以参考以前写的一些简介或官方介绍。下面就考试再做一些详细介绍。 1 区别 CDGA:数据治理工程师(Certified Data Governance Associate),“DAMA中国”组织的数据治理方面的职业认证考试。 CDGP:数据治理专家(Certified Data Governa…...
React的生命周期详细讲解
什么是生命周期? 所谓的React生命周期,就是指组件从被创建出来,到被使用,最后被销毁的这么一个过程。而在这个过程中,React提供了我们会自动执行的不同的钩子函数,我们称之为生命周期函数。**组件的生命周期…...
蓝蓝算法二期工程day3,一万年太久,只争朝夕
思路: 最好想的是用hashmap,当然用c的话也可以用两个数组,一个数组用于存放字符串,自动对应ACSII码,一个将对应ACSII码的数字对应其下标,当然这也是用的映射的思想。 import java.util.*;public class Cac…...
程序代码的自动化生成方案设计
程序设计就能够适用这种代码自动化生成方法的前提是:PLC 程序代码具有高度重复性,执行的是相同数据处理或者逻辑判断,而相关变量组 是离 散 的,没 有规 律 可循 。以 I/O 变量和中间 变量的地 址 映 射 程序为例 ,程序代码为赋 值 语 句 ,高度重复;IO 变量和与 其 对应 的中间 …...
Go 稀疏数组学习与实现
仍然还是一个数组 基本介绍 一般就是指二维以上的数组 当一个数组中大部分元素是0 ,或者为同一个值的数组时,可以使用系数数组来保存该数组. 稀疏数组的处理方法: 记录数组一共有几行几列,有多少个不同的值把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程…...
MySQL 学习笔记(借鉴黑马程序员MySQL)
MySQL视频课链接 MySQL概述 数据库相关概念 数据库是存储数据的仓库,数据是有组织的进行存储(DataBase) 数据库管理系统是操纵和管理数据库的大型软件(DataBase Management System) SQL是操作关系型数据库的编程语…...
中级工程师职称申报到底需要参加答辩不?
获得中级工程师职称的方式有认定、评审、考试这几种形式。 甘建二老师先来简单说一下关于认定和考试这两种: 1.认定:中级职称认定一般是根据各地职称认定政策,如果你想走认定渠道,首先本人简历条件、业绩、奖项等非常优秀&#…...
MM32开发教程(LED灯)
文章目录前言一、MM32介绍和STM32的区别二、板载LED灯原理图三、代码编写总结前言 今天将为大家介绍一款性能高体积小的MM32,这款开发板出自百问网团队。他就是灵动的MM32F3273,他体积非常小便于携带。 有128KB的SRAM、512KB的Flash、而且还支持双TypeC…...
win10安装docker
1.win10安装docker,前提必须是要安装WSL2。 现在Docker Desktop默认使用WSL 2来运行,而不是以前的Hyper-V。 WSL2 全称是Windows Subsystem on Linux。意思是,在win10,可以直接启动一个Linux。因为docker依赖Linux内核。 可查看…...
设计模式系列 - 代理模式及动态代理详解
定义 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 结构 抽象角色:通过接口或抽象类声明真实角色实现的业务方法。 代…...
【分享】订阅集简云畅捷通T+cloud连接器自动同步财务费用单至畅捷通
方案场景 伴随公司发展和数字化水平提高,大量的财务单据需要手动审核和录入,这些重复机械的操作占据大量人力,同时极容易出现数据出错或丢失等情况,严重影响着企业经营效率。 使用集简云提供服务的畅捷通TCloud钉钉连接器完成财…...
GPT的发展历程
GPT是当前最火的人工智能技术之一,自推出以来就广受关注。但大家对这个技术了解多少,又知道它经历了什么? GPT的诞生离不开谷歌在人工智能领域的努力和研究。2004年,谷歌成立了人工智能实验室(现已成为谷歌 AI实验室&…...
iOS开发笔记之九十八——关于Memory Leak总结笔记
*****阅读完此文,大概需要3分钟******关于Memory leak(内存泄漏)的问题,如果是面试被问这个问题以及此类问题,主要涉及下面3个方面:内存泄漏的常见场景有哪些,列举几个常见的例子?开…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
