Redis 实现高并发库存扣减方案

背景

公司的电商系统下单 操作库存是一个频繁操作,需要高效地扣减库存,把对销售库存的操作抽出来独立设计一个库存中心系统。
功能包括库存的批量添加、获取、下单、支付、回退等的操作。

解决的业务痛点
  • 需要高效
  • 不超卖
方案
一、使用msql乐观锁

额外增加一个字段,并利用mybatisplus 注解@Version,可以方便地利用乐观锁的方式来操作库存。

这种方式当多个并发碰到一起时,只有一个版本的线程能拿到数据操作,并且要对数据库不断进行查询和修改的io操作,不合适,性能也不好。

二、使用分布式锁

直接加锁本质上是对竞争资源的线程进行排队处理,保证了并发时数据扣减不出错,但直接操作db效率肯定也不高。

三、放在redis操作

大概思路是,把操作库存的动作放在redis操作,(无论是下单扣减,还是回退,添加库存等)redis操作完毕发一个mq消息,然后就可以给上游服务响应了。后续的db扣除操作在消费mq时mysql慢慢消化就行。
在这里插入图片描述
上图展示了下单场景时的时序图。支付、撤销、添加库存等操作原理类似。这样的话库存是以redis为准了。

要点:
  • 创建商品时,db保存库存,并把库存同步到redis作为预热的缓存。
  • 下单时 可以多插入一个【多顶库存记录表】,并开启事务,这个表主要是用来记录操作库存的日志的,用来后续如果有问题可以对照(业务兜底)。因为都是insert 操作,没有update数据库行记录,不会有资源竞争所以效率还好,主键必须设置为长整型,并且自动递增。(这个步骤可以根据业务不增加可以进一步提高并发)。
  • 消费mq真正对db的库存操作时,可以先对当前sku的redis缓存增加缓存有效时间,相当于给当前操作的sku缓存续命,防止缓存在处理时失效导致redis的数据和db的库存不一致。
  • 消费端消费mq消息时要 对每个sku要加分布式锁的处理,保证数据的正确。
  • 我是用lua脚本的方式让库存的操作在redis那边也保证原子执行。因为我的库存有 可用库存、锁定库存、已售库存,所以我用redis的hash数据结构存储:
    在这里插入图片描述

可以看到每个操作都写了两个lua脚本目的是为了提高下效率,先查询一下(check),因为是批量操作,如果有不符合要求的直接返回了,不用等到执行一半再返回。

  • 还有一点要注意因为redis在生产是部署在集群环境,想要key落在同一个槽中,key的名字要加{}即可,否则会报错
    在这里插入图片描述
  • 集群环境下同一个lua脚本中不能操作两个不同槽的key的数据(即两个用不同大括号括起来的key),否则也会报错
    在这里插入图片描述

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

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

相关文章

PostgreSQL 如何解决数据迁移过程中的数据类型不匹配问题?

文章目录 一、了解常见的数据类型不匹配情况1. 整数类型差异2. 浮点数类型差异3. 字符类型差异4. 日期和时间类型差异 二、解决数据类型不匹配的一般策略1. 数据转换2. 调整数据库表结构3. 数据清洗和预处理 三、PostgreSQL 中的数据类型转换函数1. 数值类型转换2. 字符类型转换…

解决虚拟机文件因快照占用硬盘空间较多的情况(压缩虚拟机文件,节省硬盘空间)

在使用虚拟机(Wmware)中,我们经常会在需要的时候拍摄虚拟机快照,尤其是虚拟机运行时的快照,动辄几个G,容易占满硬盘空间,那么有什么方法能够压缩虚拟机文件呢 下面是压缩后的存放虚拟机的文件夹 可以看到节约了大约2…

去除Win32 Tab Control控件每个选项卡上的深色对话框背景

一般情况下,我们是用不带边框的对话框来充当Tab Control的每个选项卡的内容的。 例如,主对话框IDD_TABBOX上有一个Tab Control,上面有两个选项卡,第一个选项卡用的是IDD_DIALOG1充当内容,第二个用的则是IDD_DIALOG2。I…

搜维尔科技:OptiTrack在NAB2024展示了一系列业界领先的媒体技术

广泛的显示和动作捕捉跟踪技术组合涵盖无与伦比的室内和室外 LED 解决方案、前沿技术演示以及最新的软件和硬件产品 可视化技术领域的全球领导者 Planar及其附属公司 3D 跟踪系统的全球领导者OptiTrack宣布,两家公司将在 2024 年全国广播协会 (NAB) 展会上展示其最全…

【fscan】Windows环境下的fscan安装与使用指南

Fscan是一款专为网络安全专业人士设计的多功能扫描工具,它能够帮助用户在Windows环境中执行高效的网络扫描任务。以下是关于Fscan的详细使用指南: 获取Fscan 要开始使用Fscan,首先需要从其GitHub仓库下载最新版本的预编译二进制可执行文件。…

Android布局简介

布局是一种可用于放置很多控件的容器,根据既定的规则决定内部控件的位置。当然,布局的内部也可以放置布局,即布局嵌套,布局嵌套可以实现一些比较复杂的界面。 Android中有多种编写程序界面的方式可供选择。Android Studio提供了相…

音视频质量评判标准

一、实时通信延时指标 通过图中表格可以看到,如果端到端延迟在200ms以内,说明整个通话是优质的,通话效果就像大家在同一个房间里聊天一样;300ms以内,大多数人很满意,400ms以内,有小部分人可以感…

Docker-compse的应用

1 docker-compose # 使用了docker 面临一个比较大的问题,如果一个djagno项目,使用mysql,redis,不要一次性把所有服务都放到一个容器中,每个服务一个容器,批量的管理多个容器,比较难以操作&…

go-redis源码解析:连接池原理

1. 执行命令的入口方法 redis也是通过hook执行命令,initHooks时,会将redis的hook放在第一个 通过hook调用到process方法,process方法内部再调用_process 2. 线程池初始化 redis在新建单客户端、sentinel客户端、cluster客户端等&#xff0c…

网站更新改版了

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:Leo杂谈 ✨特色专栏:MySQL学…

大模型/NLP/算法面试题总结2——transformer流程//多头//clip//对比学习//对比学习损失函数

用语言介绍一下Transformer的整体流程 1. 输入嵌入(Input Embedding) 输入序列(如句子中的单词)首先通过嵌入层转化为高维度的向量表示。嵌入层的输出是一个矩阵,每一行对应一个输入单词的嵌入向量。 2. 位置编码&…

潜在空间可视化(Latent space visualization)

在“深度学习”系列中,我们不会看到如何使用深度学习来解决端到端的复杂问题,就像我们在《A.I. Odyssey》中所做的那样。我们更愿意看看不同的技术,以及一些示例和应用程序。 1、引言 上次(Autoencoders - Deep Learning bits #…

c++习题07-求小数的某一位

目录 一,问题 二,思路 三,代码 一,问题 二,思路 被除数a的类型设置为long long类型,a变量需要变大,需要更大的数据类型来存储除数b和指定的小数位置n为int类型,这两个变量的的…

Scissor算法-从含有表型的bulkRNA数据中提取信息进而鉴别单细胞亚群

在做基础实验的时候,研究者都希望能够改变各种条件来进行对比分析,从而探索自己所感兴趣的方向。 在做数据分析的时候也是一样的,我们希望有一个数据集能够附加了很多临床信息/表型,然后二次分析者们就可以进一步挖掘。 然而现实…

共生与变革:AI在开发者世界的角色深度剖析

在科技日新月异的今天,人工智能(AI)已不再是遥不可及的概念,而是逐步渗透到我们工作与生活的每一个角落。对于开发者这一群体而言,AI的崛起既带来了前所未有的机遇,也引发了关于其角色定位的深刻讨论——AI…

【分布式系统】ceph部署(命令+截图巨详细版)

目录 一.存储概述 1.单机存储设备 2.单机存储的问题 3.商业存储 4.分布式存储​编辑 4.1.什么是分布式存储 4.2.分布式存储的类型 二.ceph概述 1.ceph优点 2.ceph架构 3.ceph核心组件 4.OSD存储后端 5.ceph数据存储过程 6.ceph版本发行生命周期 7.ceph集群部署 …

二叉树超详细解析

二叉树 目录 二叉树一级目录二级目录三级目录 1.树的介绍1.1树的定义1.2树的基本术语1.3相关性质 2.二叉树介绍2.1定义2.2 性质 3.二叉树的种类3.1 满二叉树3.2完全二叉树3.3 二叉查找树特点:二叉查找树的节点包含的基本信息: 3.4 平衡二叉树 4.二叉树的…

研华运动控制卡在LabVIEW中的应用

在现代工业和科研领域中,精密运动控制系统的需求日益增加。这些系统广泛应用于自动化生产线、精密机械加工、机器人控制、光学仪器调试和实验室自动化设备等诸多领域。本文以研华公司的运动控制卡为例,详细介绍其在LabVIEW中的应用,展示如何通…

初识数组(二)

目录 1. 二维数组的初始化 1) 不完全初始化 2) 完全初始化 3) 按照行初始化 4) 初始化时省略行,但是不能省略列 2.二维数组的使用 1) 二维数组的下标 2)二维数组的输入和输出 3. 二维数…

gif压缩大小但不改变画质的最佳方法,7个gif压缩免费工具别错过!

你会不会也碰到过当你需要在自媒体平台上上传gif文件时,你会发现网页端最大限制为15MB,而手机端最大限制为5MB。那么如何在不不改变画质的同时压缩gif大小呢?如今,由于其特殊的动画以及快速传输的特点,gif文件已经成为…