排队下单生成自增排序号码的问题场景分析

news/2025/2/28 20:06:09/文章来源:https://www.cnblogs.com/lizhaoyao/p/18605502

今天和同事去地铁口下面的一个面店吃饭,大家桌面扫码后下单,发现自己会有一个取餐号,我的是39,同事的是40多。

这当然很容易想到,这个取餐号码是自增的,这种场景再熟悉不过了,在以往我们去饭店吃饭拿到的号因为是在柜台口头下单,服务员扫码支付,所以小票机器打出来的单号就很容易是看的出来自增的,这种生成逻辑就是+1就行了,只有一个地方在点单,这样的逻辑当然没问题。

现在是桌面扫码了,就出现了我们开发最常见也最头疼的问题,并发问题。如果现在的最大取餐号是30,两人同时下单,或者同时支付,怎么保证两人取到的一个是31 一个是32 ,而不是都是31?

假设现在订单表如下:

表格内容如下:

这是 百变机兽之洛洛历险记 的主要角色和人物,我们采用这些人物角色带入他们在餐厅点单的场景。

1号洛洛和2号晶晶已经先下单,拿到游戏,开始体验,我们看到我们应该自动分配出 0001 给洛洛 , 0002 给晶晶,然后其余的机车族战士和猛兽族战士也纷纷下单获得技能卡,各自得到取餐号,现在最大取餐号是0012,下一个应该是0013。

现在金铁兽也要下单,该如何正确的分到这个0013的取餐号码呢?

方案1:

如果按最简单的开发思路,我们获取当前最大的 get_order_number ,将其取出来,然后 +1 ,之后再插入记录,那么程序设计如下:

可以看到我们的代码先是取出最大number,然后对其做00前缀的补齐,之后我们做一个拼接SQL,然后插入数据库,当然实际业务肯定比这个复杂很多,但我们这里简化了模型就用来将现在的自增序号问题。

这是最容易想到的实现方案,但是这个方案必然会有数据并发问题,假如实际情况是现在金铁兽和银铁兽都要下单,那他们都要买极光神风爪技能卡,会不会他们都分到了0013这个编号呢?

答案是显而易见的啊,非常有可能都分到这个号码,那么该如何避免这个问题呢?我们想到是不是可以设定加锁来控制写入呢,由此我们推导出方案2。

方案2

通过加锁(分布式锁 这里以redis为例),能够让代码顺序的执行,我们可以在代码执行之前设定一个变量来加锁判断一下,比如这样:

 这里我们对这个当前点单的1号店铺进行设置key并加锁判断,只有拿到锁的人才能进行点单,才能走下一步,那么显然问题出现了,这样别人就得等了,这就是阻塞住了,等于程序上降低了应用可并发的数量。这样也还是有点问题,有没有更好的方法呢?这里我们介绍方案3.

方案3

我们直接使用 redis incr 方法能对一个数进行自增且返回这个自增后的结果,那不就是我们要的了吗?大道至简啊!

 

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

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

相关文章

传知代码-改进贪心算法(NGSOR)

一、算法背景及意义 (一)背包问题背景 背包问题是组合优化领域中的经典问题,具有广泛的实际应用场景,如资源分配、项目投资决策等。扩展简化折扣{0 - 1}背包问题(ESD{0 - 1}KP)是背包问题的一种变体,它在传统背包问题的基础上增加了一些复杂的约束条件,如物品的折扣系数…

远程控制、分享屏幕软件有哪些?首选ToDesk稳定又安全

随着现如今人们常用设备的增多,查看或操作另外设备中画面信息的需求也随之加增。虽然近几年应用市场上的远程控制和屏幕分享软件已有很多,但各有利弊且也并非全部都是安全、易用的;针对选择困扰,本篇内容,小编就为大家简要讲解几款比较知名远程共享屏幕产品的特点。ToDesk…

记录_信号完整性上机报告

《信 号 完 整 性》实验报告实验工程图:2.1阻抗突变处的反射:一、 实验目的本实验旨在研究信号在遇到传输线阻抗突变时产生的反射现象。通过设置不同阻抗的传输线,模拟和分析信号反射系数的变化,观察反射对信号波形的影响。实验的核心目标是理解阻抗突变如何影响信号传播,…

分享一个类似mqttx的mqtt测试工具MQTTSHARP

工具名称:MQTTSharp v1.0 使用环境:NET8初步实现了以下功能 1、多线程连接和接收数据 2、接收数统计 3、多线程发送 4、接收分主题和汇总两张展示方式 下一版将增加 1、离线接收 2、断线重连 3、发送统计 4、其他样式美化下载地址https://files.cnblogs.com/files/weipt/MQTTS…

推荐一款轻量级且强大的 Elasticsearch GUI : elasticvue

推荐一款轻量级且强大的 Elasticsearch GUI : elasticvue 很多同学都是用过 Elasticsearch 的 GUI 工具 Kibana ,但 Kibana 相对比较重,这篇文章,笔者推荐推荐一款轻量级且强大的 Elasticsearch GUI : elasticvue 。1 下载安装 进入: https://github.com/cars10/elasticv…

Android 设置沉浸式状态栏

原文地址: Android 设置沉浸式状态栏-Stars-One的杂货小窝标题所说的沉浸式状态栏实际就是底部有背景图,而状态栏是沉浸效果(可以在背景图上面展示的),如下面的这种效果:官方API实现 官方新版本出了个api,名为enableEdgeToEdge(),方便我们使用 这种方法主要适用Activity的整个背…

工作CASE_1 Hold Lot 已经Release但是Hold记录为空

HOLD LOT已经Release,但是对应HOLD记录的Release时间是空的说明: DWT_HOLD_LOT 的Hold Lot Hold Event(Hold,EditHoldComment,Release),且每个Event都为一条记录,每条记录都有对应的RELEASE_EVENT_TIME,HOLD_SYS_ID,HOLD_RELEASE HOLD LOT已经Release,但是对应HOLD记录的…

数字加密的基本原理和典型应用场景

一、数字加密的概念 1.1 加密概念 数据加密技术是指一条消息通过加密密钥和加密函数转换成无意义的密文,接收者通过解密函数和解密密钥将密文还原成明文。这样,我们就可以保护数据不被非法窃取和读取。提高计算机安全水平的基础是掌握数据加密的本质,数据加密由明文(未加密报…

obj文件如何转换成3DTiles文件?用这款软件帮你轻松搞定

概述 在三维数据处理中,OBJ文件是一种常见的三维模型文件格式,而3DTiles作为Cesium等三维平台广泛使用的数据格式,凭借其高效的流式加载能力,成为三维可视化领域的标配。如果你正面临将OBJ文件转换为3DTiles文件的挑战,不妨试试GISBox免费GIS工具箱。这款强大的工具不仅功…

数字图像处理 (四)

图像压缩 原因:减少表示图像所需数据量,去除多余数据 图像冗余(表达数据的信息多余)编码冗余 编码符号数多余实际所需 像素间冗余 领域像素间相关性 心里视觉冗余 视觉感知的重要程度信源编码:通过减少冗余数据来实现数据压缩的过程客观保真度准则-----图像质量(相似度)…

转载:【AI系统】感知量化训练 QAT

本文将会介绍感知量化训练(QAT)流程,这是一种在训练期间模拟量化操作的方法,用于减少将神经网络模型从 FP32 精度量化到 INT8 时的精度损失。QAT 通过在模型中插入伪量化节点(FakeQuant)来模拟量化误差,并在训练过程中最小化这些误差,最终得到一个适应量化环境的模型。…

基于AI的图片背景移除工具 - 无需联网+永久免费 (附下载地址)

背景介绍​ 继上一篇文章发布以来(在浏览器里就可以运行的本地AI模型 - 一键去除图片背景AI_基于webgpu的去背景ai演示), 有不少朋友反馈虽然一键去除图片背景工具很好用, 但对于一些小白用户来说, 自己启动本地服务器太过复杂, 并且需要远程加载模型资源, 导致很容易载入失败.…