分布式问题分析(超赞!!!)

分布式事务面试题 对于分布式系统而言,需要保证分布式系统中的数据一致性,保证数据在子系统中始终保持一致,避免业务出现问题。分布式系统中对数要么一起成功,要么一起失败,必须是一个整体性的事务。分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的说,在分布式系统上一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务节点上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。 阅读详情

我是技术搬运工,好东西当然要和大家分享啦原文地址

一、谈谈业务中使用分布式的场景

分布式主要是为了提供可扩展性以及高可用性,业务中使用分布式的场景主要有分布式存储以及分布式计算。

分布式存储中可以将数据分片到多个节点上,不仅可以提高性能(可扩展性),同时也可以使用多个节点对同一份数据进行备份。

至于分布式计算,就是将一个大的计算任务分解成小任务分配到多台节点上去执行,再汇总每个小任务的执行结果得到最终结果。MapReduce 是分布式计算的最好例子。

二、分布式事务

指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。

产生原因

  • 数据库分库分表;
  • SOA 架构,比如一个电商网站将订单业务和库存业务分离出来放到不同的节点上。

应用场景

  • 下单:减少库存、更新订单状态。库存和订单不在不同一个数据库,因此涉及分布式事务。
  • 支付:买家账户扣款、卖家账户入账。买家和卖家账户信息不在同一个数据库,因此涉及分布式事务。

解决方案

1. 两阶段提交协议

两阶段提交

两阶段提交协议可以很好得解决分布式事务问题,它可以使用 XA 来实现,XA 它包含两个部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如 Oracle、DB2 这些商业数据库都实现了 XA 接口;而事务管理器作为全局的协调者,负责各个本地资源的提交和回滚。

2. 消息中间件

消息中间件也可称作消息系统 (MQ),它本质上是一个暂存转发消息的一个中间件。在分布式应用当中,我们可以把一个业务操作转换成一个消息,比如支付宝的余额转入余额宝操作,支付宝系统执行减少余额操作之后向消息系统发送一个消息,余额宝系统订阅这条消息然后进行增加余额宝操作。

(一)消息处理模型

点对点


发布/订阅


(二)消息的可靠性

消息的发送端的可靠性:发送端完成操作后一定能将消息成功发送到消息系统。

消息的接收端的可靠性:接收端仅且能够从消息中间件成功消费一次消息。

发送端的可靠性

在本地数据建一张消息表,将消息数据与业务数据保存在同一数据库实例里,这样就可以利用本地数据库的事务机制。事务提交成功后,将消息表中的消息转移到消息中间件,若转移消息成功则删除消息表中的数据,否则继续重传。

接收端的可靠性

保证接收端处理消息的业务逻辑具有幂等性:只要具有幂等性,那么消费多少次消息,最后处理的结果都是一样的。

保证消息具有唯一编号,并使用一张日志表来记录已经消费的消息编号。

三、负载均衡的算法与实现

算法

1. 轮询(Round Robin)

轮询算法把每个请求轮流发送到每个服务器上。下图中,一共有 6 个客户端产生了 6 个请求,这 6 个请求按 (1, 2, 3, 4, 5, 6) 的顺序发送。最后,(1, 3, 5) 的请求会被发送到服务器 1,(2, 4, 6) 的请求会被发送到服务器 2。


该算法比较适合每个服务器的性能差不多的场景,如果有性能存在差异的情况下,那么性能较差的服务器可能无法承担多大的负载。下图中,服务器 2 的性能比服务器 1 差,那么服务器 2 可能无法承担多大的负载。


2. 加权轮询(Weighted Round Robbin)

加权轮询是在轮询的基础上,根据服务器的性能差异,为服务器赋予一定的权值。例如下图中,服务器 1 被赋予的权值为 5,服务器 2 被赋予的权值为 1,那么 (1, 2, 3, 4, 5) 请求会被发送到服务器 1,(6) 请求会被发送到服务器 2。


3. 最少连接(least Connections)

由于每个请求的连接时间不一样,使用轮询或者加权轮询算法的话,可能会让一台服务器当前连接数多大,而另一台服务器的连接多小,造成负载不均衡。例如下图中,(1, 3, 5) 请求会被发送到服务器 1,但是 (1, 3) 很快就断开连接,此时只有 (5) 请求连接服务器 1;(2, 4, 6) 请求被发送到服务器 2,只有 (2) 的连接断开。该系统继续运行时,服务器 2 会承担多大的负载。


最少连接算法就是将请求发送给当前最少连接数的服务器上。例如下图中,服务器 1 当前连接数最小,那么新到来的请求 6 就会被发送到服务器 1 上。


4. 加权最小连接(Weighted Least Connection)

在最小连接的基础上,根据服务器的性能为每台服务器分配权重,根据权重计算出每台服务器能处理的连接数。


5. 随机算法(Random)

把请求随机发送到服务器上。和轮询算法类似,该算法比较适合服务器性能差不多的场景。


实现

1. DNS 解析

使用 DNS 作为负载均衡器,根据负载情况返回不同服务器的 IP 地址。大型网站基本使用了这种方式最为第一级负载均衡手段,然后在内部使用其它方式做第二级负载均衡。


2. 修改 MAC 地址

使用 LVS(Linux Virtual Server)这种链路层负载均衡器,根据负载情况修改请求的 MAC 地址。


3. 修改 IP 地址

在网络层修改请求的目的 IP 地址。


4. HTTP 重定向

HTTP 重定向负载均衡服务器收到 HTTP 请求之后会返回服务器的地址,并将该地址写入 HTTP 重定向响应中返回给浏览器,浏览器收到后需要再次发送请求。


5. 反向代理

正向代理:发生在客户端,是由用户主动发起的。比如翻墙,客户端通过主动访问代理服务器,让代理服务器获得需要的外网数据,然后转发回客户端。

反向代理:发生在服务器端,用户不知道代理的存在。


四、分布式锁

Java 提供了两种内置的锁的实现,一种是由 JVM 实现的 synchronized 和 JDK 提供的 Lock,当你的应用是单机或者说单进程应用时,可以使用 synchronized 或 Lock 来实现锁。当应用涉及到多机、多进程共同完成时,那么这时候就需要一个全局锁来实现多个进程之间的同步。

使用场景

在服务器端使用分布式部署的情况下,一个服务可能分布在不同的节点撒花姑娘,比如订单服务分布式在节点 A 和节点 B 上。如果多个客户端同时对一个服务进行请求时,就需要使用分布式锁。例如当 APP 端的请求路由到了节点 A,WEB 端被路由到了 B 服务,这时对共享资源进行使用时需要使用分布式锁。

实现方式

1. 数据库分布式锁

(一)基于 MySQL 锁表

该实现方式完全依靠数据库唯一索引来实现。当想要获得锁时,就向数据库中插入一条记录,释放锁时就删除这条记录。如果记录具有唯一索引,就不会同时插入同一条记录。这种方式存在以下几个问题:

  1. 锁没有失效时间,解锁失败会导致死锁,其他线程无法再获得锁。
  2. 只能是非阻塞锁,插入失败直接就报错了,无法重试。
  3. 不可重入,同一线程在没有释放锁之前无法再获得锁。

(二)采用乐观锁增加版本号

根据版本号来判断更新之前有没有其他线程更新过,如果被更新过,则获取锁失败。

2. Redis 分布式锁

(一)基于 SETNX、EXPIRE

使用 SETNX(set if not exist)命令插入一个键值对时,如果 Key 已经存在,那么会返回 False,否则插入成功并返回 True。因此客户端在尝试获得锁时,先使用 SETNX 向 Redis 中插入一个记录,如果返回 True 表示获得锁,返回 False 表示已经有客户端占用锁。

EXPIRE 可以为一个键值对设置一个过期时间,从而避免了死锁的发生。

(二)RedLock 算法

ReadLock 算法使用了多个 Redis 实例来实现分布式锁,这是为了保证在发生单点故障时还可用。

  1. 尝试从 N 个相互独立 Redis 实例获取锁,如果一个实例不可用,应该尽快尝试下一个。
  2. 计算获取锁消耗的时间,只有当这个时间小于锁的过期时间,并且从大多数(N/2+1)实例上获取了锁,那么就认为锁获取成功了。
  3. 如果锁获取失败,会到每个实例上释放锁。

3. Zookeeper 分布式锁

Zookeeper 是一个为分布式应用提供一致性服务的软件,例如配置管理、分布式协同以及命名的中心化等,这些都是分布式系统中非常底层而且是必不可少的基本功能,但是如果自己实现这些功能而且要达到高吞吐、低延迟同时还要保持一致性和可用性,实际上非常困难。

(一)抽象模型

Zookeeper 提供了一种树形结构级的命名空间,/app1/p_1 节点表示它的父节点为 /app1。


(二)节点类型

  • 永久节点:不会因为会话结束或者超时而消失;
  • 临时节点:如果会话结束或者超时就会消失;
  • 有序节点:会在节点名的后面加一个数字后缀,并且是有序的,例如生成的有序节点为 /lock/node-0000000000,它的下一个有序节点则为 /lock/node-0000000001,依次类推。

(三)监听器

为一个节点注册监听器,在节点状态发生改变时,会给客户端发送消息。

(四)分布式锁实现

  1. 创建一个锁目录 /lock。
  2. 在 /lock 下创建临时的且有序的子节点,第一个客户端对应的子节点为 /lock/lock-0000000000,第二个为 /lock/lock-0000000001,以此类推。
  3. 客户端获取 /lock 下的子节点列表,判断自己创建的子节点是否为当前子节点列表中序号最小的子节点,如果是则认为获得锁,否则监听自己的前一个子节点,获得子节点的变更通知后重复此步骤直至获得锁;
  4. 执行业务代码,完成后,删除对应的子节点。

(五)会话超时

如果一个已经获得锁的会话超时了,因为创建的是临时节点,因此该会话对应的临时节点会被删除,其它会话就可以获得锁了。可以看到,Zookeeper 分布式锁不会出现数据库分布式锁的死锁问题。

(六)羊群效应

在步骤二,一个节点未获得锁,需要监听监听自己的前一个子节点,这是因为如果监听所有的子节点,那么任意一个子节点状态改变,其它所有子节点都会收到通知,而我们只希望它的下一个子节点收到通知。

五、分布式 Session

如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在 A、B 两台服务器,用户在第一次访问网站时,Nginx 通过其负载均衡机制将用户请求转发到 A 服务器,这时 A 服务器就会给用户创建一个 Session。当用户第二次发送请求时,Nginx 将其负载均衡到 B 服务器,而这时候 B 服务器并不存在 Session,所以就会将用户踢到登录页面。这将大大降低用户体验度,导致用户的流失,这种情况是项目绝不应该出现的。

1. 粘性 Session

原理

粘性 Session 是指将用户锁定到某一个服务器上,比如上面说的例子,用户第一次请求时,负载均衡器将用户的请求转发到了 A 服务器上,如果负载均衡器设置了粘性 Session 的话,那么用户以后的每次请求都会转发到 A 服务器上,相当于把用户和 A 服务器粘到了一块,这就是粘性 Session 机制。

优点

简单,不需要对 Session 做任何处理。

缺点

缺乏容错性,如果当前访问的服务器发生故障,用户被转移到第二个服务器上时,他的 Session 信息都将失效。

适用场景

  • 发生故障对客户产生的影响较小;
  • 服务器发生故障是低概率事件。

2. 服务器 Session 复制

原理

任何一个服务器上的 Session 发生改变,该节点会把这个 Session 的所有内容序列化,然后广播给所有其它节点,不管其他服务器需不需要 Session,以此来保证 Session 同步。

优点

可容错,各个服务器间 Session 能够实时响应。

缺点

会对网络负荷造成一定压力,如果 Session 量大的话可能会造成网络堵塞,拖慢服务器性能。

实现方式

  1. 设置 Tomcat 的 server.xml 开启 tomcat 集群功能。
  2. 在应用里增加信息:通知应用当前处于集群环境中,支持分布式,即在 web.xml 中添加<distributable/> 选项。

3. Session 共享机制

使用分布式缓存方案比如 Memcached、Redis,但是要求 Memcached 或 Redis 必须是集群。

使用 Session 共享也分两种机制,两种情况如下:

3.1 粘性 Session 共享机制

和粘性 Session 一样,一个用户的 Session 会绑定到一个 Tomcat 上。Memcached 只是起到备份作用。


3.2 非粘性 Session 共享机制

原理

Tomcat 本身不存储 Session,而是存入 Memcached 中。Memcached 集群构建主从复制架构。


优点

可容错,Session 实时响应。

实现方式

用开源的 msm 插件解决 Tomcat 之间的 Session 共享:Memcached_Session_Manager(MSM)

4. Session 持久化到数据库

原理

拿出一个数据库,专门用来存储 Session 信息。保证 Session 的持久化。

优点

服务器出现问题,Session 不会丢失

缺点

如果网站的访问量很大,把 Session 存储到数据库中,会对数据库造成很大压力,还需要增加额外的开销维护数据库。

5. Terracotta 实现 Session 复制

原理

Terracotta 的基本原理是对于集群间共享的数据,当在一个节点发生变化的时候,Terracotta 只把变化的部分发送给 Terracotta 服务器,然后由服务器把它转发给真正需要这个数据的节点。它是服务器 Session 复制的优化。


优点

这样对网络的压力就非常小,各个节点也不必浪费 CPU 时间和内存进行大量的序列化操作。把这种集群间数据共享的机制应用在 Session 同步上,既避免了对数据库的依赖,又能达到负载均衡和灾难恢复的效果。

六、分库与分表带来的分布式困境与应对之策


事务问题

使用分布式事务。

查询问题

使用汇总表。

ID 唯一性

  • 使用全局唯一 ID:GUID。
  • 为每个分片指定一个 ID 范围。
  • 分布式 ID 生成器 (如 Twitter 的 Snowflake 算法)。

参考资料

最全分布式面试题整理 CAP定理是分布式计算领域的一个基本原理,它阐述了在设计分布式系统时,一致性(Consistency)、可用性(Availability)、分区容忍性(Partition Tolerance)这三个目标无法同时被完全满足,只能在其中两个方面进行权衡。所有节点在同一时间看到相同的数据。即,当一个节点对数据进行了更新,所有其他节点都应该立即看到这一变化。系统保证对于每个请求都能够返回一个明确的响应,不保证数据实时一致。系统能够继续工作,哪怕网络中断或出现分区,即节点之间的通信发生问题。 阅读详情

相关推荐

分布式事务相关面试题

分布式事务 1.什么是事务 访问并更新数据库中各种数据项的一个程序执行单元 通俗一点说就是,一手交钱一手交货,要么钱货两清,要么终止交易 2.什么是本地事务 通常我们使用关系型数据库来控制事务(是数据库本身的能力),数据库事务,应用程序主要靠关系型数据库来控制事务,通常单体架构中,数据库跟应用程序是在一起的(同一个服务器),所以基于关系型数据库的事务,又被称为本地事务 3.spring如何接管本地事务 使用:1.配置文件 2.注解 核心是阻止了原来返回的connection,返回了自己的connection

poker_zero的博客 6105

121道分布式面试题和答案,25K妥妥的

最近整理了分布式面试题,一共有121道,后面会不断增加,争取做到全网最全的分布式面试题。大部分题目都是来自小伙伴们在面试中被问到后,反馈到我这里的。也由此可知,下一个被问到的估计就是你。分...

田维常 7370

redis分布式缓存一一 帖子点赞解决方案~

嗨~大家好,这里是SharingOfficer,一起来聊一聊帖子点赞解决方案,咱们往下看???? 点赞业务场景分析 点赞或取消点赞,用户点击功能 看帖子信息:通过用户id和帖子id,查看该帖子的点赞数、该用户是否点赞状态。 点赞的技术方案 点赞的关键技术就是要判断该用户是否点赞,已重复点赞的不允许再点赞,即过滤重复,虽然业务不复杂,可以采用数据库直接实现,但是对于微博这种高并发的场景,不可能查数据库的,一般是缓存,即redis 点赞或取消点赞,用户点击功能 采用的是redis的set数据结构

SharingOfficer的博客 2233

面试题之分布式事务篇

概述:在分布式系统上一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务节点上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。如下所示:某电商系统的下单操作,需要请求三个服务来完成,这三个服务分别是:订单服务,账户服务,库存服务。当订单生成完毕以后,就需要分别请求账户服务和库存服务进行进行账户余额的扣减和库存扣减。假设都扣减成功了,此时在执行下单的后续操作时出现了问题,那么订单数据库就进行事务回滚,订单生成失败,而账户余额和扣减则都扣减成功了。

小恶魔的博客 3466

【面试题】商品超买超卖问题分析及实战

文章目录项目场景:原因分析:原因说明:解决方案:代码实战:1、synchronized方式2、redis分布式锁3、悲观锁4、乐观锁5、where条件6、unsigned 非负字段限制为什么不通过事务隔离级别控制事务代码的并发总结: 项目场景: 原文链接 商品超买超卖是高并发下非常典型的问题,也是面试中秒杀场景常常会问到的问题。 常见的问题有: 1、怎么设计一个秒杀系统? 2、商品超买、超卖问题产生的原因? 3、怎么防止商品出现超买|超卖问题? 4、乐观锁和悲观锁的适用场景是什么? 5、提高事务的隔离级别能

AloneYue优快云 2390

秒杀场景下超卖问题解决方案

秒杀超卖现象:在高并发下,多个线程并发更新库存,导致库存为负的情况。 我搜集了一些资料,整理了一下,秒杀可选方案主要有以下三种: 1.超卖原因 一个简单的订单表 create table orders ( sku_id int PRIMARY KEY, count int ) 一个/buy接口 begin() count = db.Query(`select count ...

glamour2015的博客 6364

超卖问题解决大全

文章目录什么是库存超卖??方式一:扣减库存时限制库存量大于0方式二:悲观锁方式三:乐观锁方式四:将请求放队列方式五:通过事务控制超卖方式六使用redis分布式来解决(悲观锁)基于redis实现分布式锁基于redisson开源框架实现redis分布式锁的缺点redis分布式锁优化redis分布式锁优化缺点方式七使用redis的原子操作解决超卖共享锁和排他锁共享锁和排他锁的加锁原则Spring事务-数...

fly_miqiqi的博客 1万+

分布式共识问题

在讲述分布式的共识问题之前,我们先了解下什么是拜占庭将军问题, 其次从拜占庭将军问题来认识什么是分布式共识问题,与分布式一致性的区分在哪里?然后推演分布式共识问题产生的原因以及解决共识问题的策略算法有哪些,对应的适用场景有哪些?接下来我们可以带着疑问来逐步揭开上述问题的本质.另外这里要先说明一点,这里讲述的服务节点不可用包含网络超时/服务节点出现故障/网络通信被伪造等情况. 拜占庭将军问题 拜占庭一般性问题 拜占庭军队中的每一个师都有自己的将军,并且由该将军负责指挥作战 现在拜占庭军队中的将军存在一些叛徒

疾风先生的博客 2385

商品超买超卖问题分析及实战

商品超买超卖是高并发下非常典型的问题,也是面试中秒杀场景常常会问到的问题。 常见的问题有: 1、怎么设计一个秒杀系统? 2、商品超买、超卖问题产生的原因? 3、怎么防止商品出现超买|超卖问题? 4、乐观锁和悲观锁的适用场景是什么? 5、提高事务的隔离级别能解决超买|超卖问题吗?

弹指天下 5322

TSMC 40nm LP工艺下,新手画版图最容易踩的5个坑(附Cadence避坑指南)

本文详细解析了TSMC 40nm LP工艺下版图设计的5个常见陷阱,包括MOS管尺寸转换、DNW隔离、Guard Ring设计、金属布线和DRC检查。通过Cadence实战技巧和设计规则优化,帮助新手工程师规避典型错误,提升版图设计效率和质量。

weixin_26800111的博客 456

用简单仿真链路产生 WiFi CSI(不依赖专用工具箱,matlab实现)

这篇文章详细介绍了使用MATLAB仿真生成WiFi信道状态信息(CSI)的过程。内容包括:准备工作(定义OFDM和MIMO参数)、基本参数设置(天线数、FFT点数等)、构造训练OFDM符号、多径瑞利信道建模、逐天线时分发射接收处理、CSI信道估计方法,以及幅值和相位的可视化。通过BPSK调制和瑞利衰落信道仿真,实现了简单的CSI生成流程,为初学者理解CSI产生机理提供了直观指导。文章强调这仅是基础仿真,更深入的研究需要实际数据采集。文末还提供了WiFi指纹定位的相关参考资料。

静水流深,沧笙踏歌 1205

点赞功能模块-文章点赞功能实现

PraiseController.java //点赞文章 @RequestMapping(value = "on",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) public BaseResponse praiseOn(@RequestBody @Validated PraiseDto dto, BindingResult result){ Str...

weixin_37841366的博客 4346

2026闲鱼数据采集实战:本地YOLO识别滑块验证码+接口签名分析+零成本价格监控系统

2026闲鱼反爬系统升级实战:零成本解决方案 本文针对2026年闲鱼最新反爬机制提出了一套完整的零成本解决方案。系统面临四大挑战:AI滑块验证、接口签名升级、设备指纹绑定和精细化行为检测。通过以下技术突破实现稳定运行: 本地化AI破解:训练YOLOv11n模型实现98%准确率的滑块识别,替代付费打码平台 逆向工程:Hook闲鱼App签名算法,用Python重写HMAC-SHA256签名生成器 设备指纹管理:建立"一机一号一IP"机制,维护50+种设备特征 行为模拟:开发四阶段滑动轨迹模型

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1455

Redis(十五)——Springboot整合Redis超卖问题还原和分析

前言 前面几篇博客,讲明了Redis的安装、配置和基本命令使用;以及java使用Redis操作数据、Springboot整合Redis操作数据等。 本篇博客以某公众号思想为例,写结合Redis对高并发环境下,商品超卖问题的解决思路。 超卖简单代码 写一段简单正常的超卖逻辑代码,多个微服务同时操作同一段数据,探究出现的问题。 Redis中存储一项数据信息,请求对应接口,获取商品数量信息; 商品数量信息如果大于0,则扣减1,重新存储Redis中; 运行代码测试问题。 其他代码的配置项,采取上一篇博客的配置为

专注写bug 929

Ubuntu22.04上如何用Docker一键部署Ragflow+Ollama(附CUDA配置避坑指南)

本文详细介绍了在Ubuntu22.04系统上使用Docker一键部署Ragflow+Ollama的完整流程,特别提供了CUDA配置的避坑指南。从硬件兼容性检查、驱动安装到容器网络配置,手把手教你搭建本地化大模型环境,解决CUDA驱动冲突等常见问题,助力开发者快速构建AI应用开发平台。

weixin_26875109的博客 284

Android手机本地语音转文字实战:用FunASR+ONNX Runtime打造离线ASR应用(附模型下载)

本文详细介绍了如何在Android应用中集成FunASR和ONNX Runtime,构建高性能的离线语音识别系统。通过模型选择、工程化集成和性能调优等实战技巧,开发者可以实现本地语音转文字功能,有效保护用户隐私并提升响应速度。

weixin_29046611的博客 266

计算广告实时结算超投问题解决方案的分析

计算广告实时结算超投问题解决方案的分析 1、超投问题应对方案 大流量高并发的实时结算系统会有一个令人十分头疼的问题,就是超投。在广告系统中,结算环节会实时计算各个广告主账户内的余额,如余额为0,既要立刻停止投放。所谓超投,就是指在结算系统发出停止投放的指令到系统实际将广告下线的这段时间内,投放系统错误的将下线广告投放出去。这部分被错误投放的广告是不能向广告主收钱的,也就造成了平台的损失。由

Path 3503

华为交换机实战:如何用ACL+流分类精准限制特定IP的网速(附完整命令)

本文详细介绍了华为交换机如何通过ACL+流分类技术实现精准IP限速,包括ACL规则配置、流分类关联、流行为定义及流策略应用等完整步骤。文章提供了实战命令和配置验证方法,帮助网络管理员有效管理带宽资源,解决特定IP占用过多带宽的问题。

weixin_29229055的博客 100

关于超卖程序问题分析-java

关于超卖程序问题分析1.并发情况下,GET缓存 + 判断>0,成立,均执行扣减库存,导致超卖2.加锁以库存key,加锁,setNx,finally解锁deleteKey存在问题1.误解锁(是不是也是因为加锁时间过短问题,释放锁时出现问题)参考举个例子:客户端A取得资源锁,但是紧接着被一个其他操作阻塞了,当客户端A运行完毕其他操作后要释放锁时,原来的锁早已超时并且被Redis自动释放,并且在这期间资源锁又被客户端B再次获取到。

C18298182575的博客 693

从.bib到.bbl:手把手教你搞定LaTeX参考文献的完整流程

本文详细介绍了从.bib到.bbl的LaTeX参考文献处理完整流程,包括文献数据库构建、样式选择、主文档配置、编译流程及问题排查。特别针对.bib、.bbl等文件的操作提供了实战解决方案,帮助用户高效管理学术文献引用,适用于各类学术写作场景。

weixin_29292431的博客 285

医疗大模型实战——从零构建MedicalGPT全流程解析

本文详细解析了从零构建医疗大模型MedicalGPT的全流程实战。基于Qwen-7B模型与约195万条中文医疗数据,完整复现了增量预训练、监督微调与偏好对齐三大核心环节,并分享了如何在有限硬件资源下实现高效训练与部署,为开发者提供了可复现的医疗AI项目实战指南。

weixin_29193259的博客 553

[分布式锁] Springboot整合Redisson实现超卖问题还原和分析

超卖简单代码 写一段简单正常的超卖逻辑代码,多个用户同时操作同一段数据,探究出现的问题。 Redis中存储一项数据信息,请求对应接口,获取商品数量信息; 商品数量信息如果大于0,则扣减1,重新存储Redis中; 运行代码测试问题。 /** * Redis数据库操作,超卖问题模拟 * @author * */ @RestController public class RedisController { // 引入String类型redis操作模板 @Autowired priva

GSON的博客 2404

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

电商之库存超卖或者秒杀超卖问题

在秒杀活动或者是11.11或者6.18场景中,对于某个商品在某个时间段,瞬间出现大量的的购买订单,导致库存读取不正确,销售量超过了实际的库存,但是超卖了todo适用架构: 单体架构 锁也是在单体架构中也是一个选择锁的实现有很多其他的方式,但是原理大概都是相同的。适用架构:单体+分布式原理:redis本身支持多线程,操作是队列有序的setNx语句支持,Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。java代码 redis + lua代码

阿萨的专栏 834

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Redis之高并发超卖问题解决方案

redis java

qq_43649937的博客 4982

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

5.全局唯一的订单id和超卖问题

线程1查询库存,发现库存充足,可以创建订单,当同时线程2和线程3也发现库存充足。然后线程1执行完扣减操作后,库存变成了0,但线程2和线程3也同样完成了库存减扣操作,最终就导致库存变成了负数。线程1查询完库存后进行库存扣减操作,线程2在查询库存时,发现库存充足,也准备执行库存扣减操作,但是需要。综上所述,使用CAS法要更加好,能够避免额外的内存开销,而对于我们的需求,需要修改代码的地方也很少的。,结果发现库存数量发生了改变,这就说明数据库中的数据已经发生了修改,需要进行重试或直接失败。

m0_57408211的博客 965

分布式锁-超卖问题案例分析

我们先来看一个业务场景: 系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户下单。 由于系统有一定的并发,所以会预先将商品的库存保存在redis中,用户下单的时候会更新redis的库存。 假如某个时刻,redis里面的某个商品库存为1,此时两个请求同时到来,其中一个请求执行到上图的第3步,更新数据库的库存为0,但是第4步还没有执行。 而另外一个请求执行到了第2步,发现库存还是1,就继续执行第3步。 这样的结果.

m0_37163942的博客 840
上一篇: 正则表达式学习总结(超赞!!!)
普通网友
博客等级 码龄9年 489粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值