kaiyun官网入口本地加锁的方式在分布式的场景下不适用,所以本文我们来探讨下如何引入分布式锁解决本地锁的问题。本篇所有代码和业务基于我的开源项目 Pass
目前题目微服务被拆分成了四个微服务。前端请求进来时,会被转发到不同的微服务。假如前端接收了 10 W 个请求,每个微服务接收 2.5 W 个请求,假如缓存失效了,每个微服务在访问数据库时加锁,通过锁(synchronzied 或 lock)来锁住自己的线程资源,从而防止缓存击穿。
这是一种本地加锁的方式,在分布式情况下会带来数据不一致的问题:比如服务 A 获取数据后,更新缓存 key =100,服务 B 不受服务 A 的锁限制,并发去更新缓存 key = 99,最后的结果可能是 99 或 100,但这是一种未知的状态,与期望结果不一致。流程图如下所示:
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
基于上面本地锁的问题,我们需要一种支持分布式集群环境下的锁:查询 DB 时,只有一个线程能访问,其他线程都需要等待第一个线程释放锁资源后,才能继续执行。
生活中的案例:可以把锁看成房门外的一把锁,所有并发线程比作人,他们都想进入房间,房间内只能有一个人进入。当有人进入后,将门反锁,其他人必须等待,直到进去的人出来。
大白话解释:所有请求的线程都去同一个地方“占坑”,如果有坑位,就执行业务逻辑,没有坑位,就需要其他线程释放“坑位”。这个坑位是所有线程可见的,可以把这个坑位放到 Redis 缓存或者数据库,这篇讲的就是如何用 Redis 做“分布式坑位”。
用 Redis 实现分布式锁的几种方案,我们都是用 SETNX 命令(设置 key 等于某 value)。只是高阶方案传的
个数不一样,以及考虑了异常情况。我们来看下这个命令,SETNX是set If not exist的简写。意思就是当 key 不存在时,设置 key 的值,存在时,什么都不做。
多个并发线程都去 Redis 中申请锁,也就是执行 setnx 命令,假设线程 A 执行成功,说明当前线程 A 获得了。
其他线程继续抢占锁,也就是执行 setnx 命令。因为线程 A 已经删除了锁,所以又有其他线程可以抢占到锁了。
:晚上小空一个人开锁进入了房间,打开了电灯,然后突然断电了,小空想开门出去,但是找不到门锁位置,那小明就进不去了,外面的人也进不来。
从技术的角度看:setnx 占锁成功,业务代码出现异常或者服务器宕机,没有执行删除锁的逻辑,就造成了死锁。
上面提到的青铜方案会有死锁问题,那我们就用上面的规避风险的方案来设计下,也就是我们的白银方案。
锁设置了一个沙漏倒计时,沙漏完后,门锁自动打开。即使房间突然断电,过一段时间后,锁会自动打开,其他人就可以进来了。5.2 技术原理图
因为占锁和设置过期时间是分两步执行的,所以如果在这两步之间发生了异常,则锁的过期时间根本就没有设置成功。
上面的白银方案中,占锁和设置锁过期时间是分步两步执行的,这个时候,我们可以联想到什么:事务的原子性(Atom)。
下面演示下如何设置 key 并设置过期时间。注意:执行命令之前需要先删除 key,可以通过客户端或命令删除。
执行结果如下图所示:每运行一次 ttl 命令,就可以看到 wukong 的过期时间就会减少。最后会变为 -2(已过期)。
黄金方案和白银方案的不同之处:获取锁的时候,也需要设置锁的过期时间,这是一个原子操作,要么都成功执行,要么都不执行。如下图所示:
用户 B 看到房间的锁打开了,于是抢占到了锁,设置锁的编号为 123,并设置了过期时间 10 秒。
锁自动清理(开锁)的时间,所以在自动开锁后,又有其他用户抢占到了锁。当用户 A 完成任务后,会把其他用户抢占到的锁给主动打开。
因为锁的编号都叫做 “123”,用户 A 只认锁编号,看见编号为 “123”的锁就开,结果把用户 B 的锁打开了,此时用户 B 还未执行完任务,当然生气了。七、铂金方案
不就好了~如下图所示,B 抢占的锁是蓝色的,和 A 抢占到绿色锁不一样。这样就不会被 A 打开了。
主动删除锁的时候,需要判断锁的编号是否和设置的一致,如果一致,则认为是自己设置的锁,可以进行主动删除。
时刻:13s。线程 A 还是拿自己设置的锁的值和返回的值进行比较,值是相等的,清理锁,但是这个锁其实是线程 B 抢占的锁。
上面的线程 A 查询锁和删除锁的逻辑不是原子性的,所以将查询锁和删除锁这两步作为原子指令操作就可以了。
本篇通过本地锁的问题引申出分布式锁的问题。然后介绍了五种分布式锁的方案,由浅入深讲解了不同方案的改进之处。
从上面几种方案的不断演进的过程中,知道了系统中哪些地方可能存在异常情况,以及该如何更好地进行处理。
:缺陷:获取锁、比较锁的值、删除锁,这三步是非原子性的。中途又可能锁自动过期了,又被其他客户端抢占了锁,导致删锁时把其他客户端占用的锁删了。
RAM时出现问题,在大约2小时内合成时发生了很大的延迟并且没有停止,对这个问题有什么解释吗?提前致谢以上来自于谷歌翻译以下为原文Hello
光伏发电与光伏地面电站相比,其安全性如何呢?请看南京研旭在本文内的具体介绍。 从使用的角度,
控制系统是在计算机监督控制系统、直接数字控制系统和计算机多级控制系统的基础上发展起来的,是生产过程的一
数据库系统(DDBS)是数据库技术和网络技术两者相互渗透和有机结合的结果。涉及数据库基本理论和网络通信理论。
电源装置是指与环境兼容的独立电源,功率为数千瓦与环境兼容。这些电源由电力部门、电力用户或第3方所有,用以满足电力系统和用户特定的要求。例如,对偏远地区的用户或商业地区、居民地
电源的配电网日前两阶段优化调度模型,EI,如图 1—3matlab源代码,高水平文章,保证正确,可先发您文章看是否满足您的要求在电力市场环境下,供电公司通过对接入配电网的
噪声源如果不相关,在RF信号组合时就会降低。对于系统中的大部分组件,这都可以非常直观地加以评估。对于锁相环,环路中的每个组件都有与之相关联的噪声传递函数
计算机操作系统支持下,互连的计算机可以互相协调工作,共同完成一项任务。 也可以这么解释: 一
现实中多设备间通信方式多种多样(WIFI、蓝牙等),不同的通信方式使用差异大,导致通信问题多;同时还面临设备间通信链路的融合共享和冲突无法处理等挑战。那么
能力给应用程序。第一个跨设备组件启动,有了这个能力就可以完成一个并发。第二个是跨设备数据传递,经由一个连接通道进行业务的协作。第三个是
和维护,这个对于应用开发是非常友好的。 HarmonyOS 系统级的数据库同步,让开发者省去了同步
操作系统kaiyun官网入口,使得应用程序的开发打破了智能终端互通的性能和数据壁垒,业务逻辑原子化开发,适配多端。通过一个简单应用开发
操作系统。对消费者而言,HarmonyOS 将生活场景中的各类终端进行能力整合,形成“One Super Device”,以实现
恒流也有它缺点,开始会增加部分设计成本,产品设计品质与线路设计选择需要权衡。可能成本增加是短暂的,表面的,应该综合考量。 2.
压力采集系统,用于假肢接受腔内部接触面的压力测量,选择哪种压力传感器和采集卡比较合适,求推荐kaiyun官网入口。
链路追踪功能结合周边的本地堆栈排查,性能Metrics统计,业务全息排查三大附加功能,形成了完整的链路监控解决
IO模块上有一个modbus互转Profinet网关, 有什么作用?多个Profinet远程
无线数据采集网络技术开始兴起,并迅速的应用到各个领域。在一些地形复杂,不适合人类出现的区域需要进行数据采集的情况下,都可以适当
综合化、一体化、小型化、网络化和智能化系统,是将众多体积小,重量轻,廉价的小功率侦察干扰机装置在易于投放的小型平台上,撒布在接近***扰目标空域地,通过指令
供电技术是指将发电设备建设在用户或供电系统端,将发电与负荷直接相连,通过局部供电的方式满足用户的电力需求。其主要特点是将传统的集中式供电方式改为分散
光伏发电发展现状光伏产业产能过剩的矛盾由来已久。我国光伏组件产量自2007年以来,连续5年位居世界第一。2011年,我国光伏组件产量是当年新增安装容量的10倍,90%的光伏组件需要销往国外
在一个网络中多台电脑上的各个系统模块(每台电脑运行多个系统模块)同时测试,监视其覆盖率、 内存泄漏、运行性能等重要测试指标。测试工具选用美国Metrowerks公司的CodeTest嵌入
视图,API接口简单,与拓扑,动态扩展或故障恢复无关,无需手动配置,自动选择备份节点,大多数缓存系统提供图形化管理控制台,简单易用保持。