三种分布式锁

一文带你弄懂thermal governor IPA 当current temp < target temp时,使用k_pu,当current temp >= target temp时,使用k_po。如果current_temperature = switch_on_temp时,则k_p = k_pu,这时Pmax。如果current_temperature = target_temp时,则k_p = k_po,这时Pmax。2、解析dts,获得switch_on_temp和target_temp。3、初始化k_pu/k_po/k_i/k_d的常数。 阅读详情

写在前面

在看这篇文章之前先要弄懂啥是分布式?啥是分布式,我的理解就是一个系统部署在多台服务器上,每一台都能提供服务,这样子所有服务器就是分布式系统,分布式的好处就是可以聚合资源,使一台机器完成不了的事让两台机器或多台机器来完成。这是最早的分布式,一台机器宕机了,其他的机器仍然可以提供服务。

一文弄懂"分布式锁"

多线程情况下对共享资源的操作需要加锁,避免数据被写乱,在分布式系统种,这个问题也是存在的,此时就需要一个分布式锁服务。常见的分布式锁实现一般是基于DB、Redis、zoomkeeper。下面笔者会按照顺序分析这3种分布式锁的设计与是实现。
分布式锁的实现有多种方式,但是不管怎样,分布式锁一般要有以下的特点:

排他性:任意时刻,只能有一个client能获取到锁
容错型:分布式锁服务一般要满足AP,也就是说,只要分布式锁服务集群节点大部分存活,client就可以进行加锁解锁操作
避免死锁: 分布式锁一定能得到释放,即使client在释放之前崩溃或者网络不可达
除了以上特点之外,分布式锁最好也能满足可重入、高性能、阻塞锁特性(AQS这种,能够及时从阻塞状态唤醒)等,下面就话不多说,赶紧上(开发分布式锁的设计和实现的)车~

DB锁

在数据库新建一张表用于控制并发控制,表结构可以如下所示:

CREATE TABLE `lock_table`(
	`id` int(11) unsigned NOT NULL COMMENT '主键',
	`key_id` bigint(20) NOT NULL COMMENT '分布式key',
	`memo` varchar(43) NOT NULL DEFAULT'' COMMENT '可记录操作内容',
	`update_time` datetime NOT NULL COMMENT '更新时间',
	PRIMARY KEY (`id`,`key_id`),
	UNIQUE KEY `key_id` (`key_id`) USING BTREE
) ENGINE = InnoDB DEFAULT CHARSET = utf-8

key_id作为分布式key用于并发控制,memo可用来记录一些操作内容(比如memo可用来支持重入特性,标记下当期加锁的client和加锁次数)。将key_id设置为唯一索引,保证了针对同一个key_id只有一个加锁(数据插入)能成功。此时lock和unlock伪代码如下:

def lock:
	exec sql : insert into lock_table( key_id,memo,update_time) values(key_id, memo, NOW())
	if result = true;
		return true
	else:
		return false
def unlock:
	exec sql:delete from lock_table where key_id = 'key_id' and memo = 'memo'

注意,伪代码中的lock操作是非阻塞锁,也就是tryLock,如果想实现阻塞(或者阻塞超时)枷锁,只修反复执行lock伪代码直到加锁成功为止即可。基于DB的分布式锁其实有一个问题,那就是如果加锁成功后,client端宕机或者由于网络原因导致没有解锁,那么其他client就无法对该key_id进行加锁并且无法释放了。为了能够让锁失效,需要在应用层加上定时任务,去删除过期还未解锁的记录,比如删除2分钟前未解锁的伪代码如下

def clear_timeout_lock:
	exec sql:delete from lock_table where update_time < ADDTIME(NOW(),'-00:02:00')

因为单实例DB的TPS一般为几百,所以基于DB的分布式性能上限一般也是1k以下,一般在并发量不大的场景下该分布式锁是满足需求的,不会出现性能问题。不过DB作为分布式锁服务需要考虑单点问题,对于分布式系统来说是不允许出现单点的,一般通过数据库的同步复制,以及使用vip切换Master就能解决这个问题。
以上DB分布式锁是通过insert来实现的,如果加锁的数据已经在数据库中存在,那么用select xxx where key_id = xxx for update来做也是可以的。

Redis锁

Redis锁是通过以下命令对资源进行加锁

set key_id key_value NX PX expireTime

其中,set nx命令只会在key不存在时给key进行赋值,px用来设置key过期时间,key_value一般是随机值,用来保证释放锁的安全性(释放时会判断是否是之前设置过的随机值,只有是才释放锁)。由于资源设置了过期时间,一点时间后锁就会自动释放。

set nx 保证并发加锁时只有一个client能设置成功(Redis内部是单线程,并且数据存在内存中,也就是说redis内部执行命令是不会有多线程同步问题的),此时lock / unlock伪代码如下:

def lock:
	if(redis.call('set',KEYS[1],ARGV[1],'ex',ARGV(2),'nx'))then
		return true
	end
		return false
def unlock:
	if(redis.call('get',KEYS[1])===ARGV[1]) then 
		redis.call('del',KEYS[1])
		return true
	end
		return false
【深度解析】AURIX TC387 UCB Flash架构与避坑指南(第一篇) 摘要:UCB(用户配置块)是AURIX TC3xx芯片启动与安全的关键配置区域,位于DFLASH0存储区。每个512字节的UCB包含启动模式、安全设置等关键参数,并通过强制CRC32校验确保完整性。UCB分为启动头(UCB_BMHD)、安全配置(UCB_ORIG)及其备份(UCB_COPY)三种主要类型。不同于常规Flash,UCB具有自动擦除特性,错误配置可能导致芯片永久锁死。开发中应谨慎修改UCB,必须同时编程原始和备份版本,并确保正确的CRC校验。后续文章将详细介绍UCB编程方法和调试技巧。 阅读详情

相关推荐

webrtc获取IceCandidate流程

foundation:用于唯一标识候选者的基础信息,通常是基于候选者的类型、IP地址、协议和replay协议计算出的字符串。component:标识候选者所属的传输组件。对于RTP流,通常使用1;对于RTCP流,通常使用2。protocol:候选者使用的传输协议,通常是UDP,但也可以是TCP(尽管在WebRTC中UDP更为常见)。priority:候选者的优先级,用于在选择最佳候选对时进行比较。优先级的计算公式考虑了候选类型优先级、本地优先级和组件ID。address:候选者的IP地址。port。

qq_42805085的博客 1900

常用的分布式锁有哪些?

前言单体架构的应用可以直接使用synchronized或者ReentrantLock就可以解决多线程资源竞争的问题。如果公司业务发展较快,可以通过部署多个服务节点来提高系统的并行处理能力。由于本地锁的作用范围只限于当前应用的线程。高并发场景下,集群中某个应用的本地锁并不会对其它应用的资源访问产生互斥,就会产生数据不一致的问题,所以分布锁就派上了用场。常见的分布式锁应用场景秒杀活动、优惠券抢购、接口幂等性校验等常用的分布式锁1. 基于数据库实现分布式锁1.1 悲观锁利用select … where … for

qq_34227856的博客 3712

【Qt-4】QT基于qhttp-server搭建http服务器

QT搭建http服务器

WXG1011的博客 5711

关于几种分布式锁的简单介绍

什么是分布式锁 要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。 1.线程锁 主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如Synchronized、Lock等。 2.进程锁 为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独...

湖人•总冠军 1807

基于Simulink/Matlab的VSG并网系统单相接地与相间短路故障仿真建模与特性分析

本文详细介绍了基于Simulink/Matlab搭建虚拟同步发电机(VSG)并网系统仿真模型的方法,并重点分析了单相接地与相间短路故障下的系统特性。通过设置三相故障模块参数,模拟了故障发生时的电压、电流变化及VSG动态响应,为理解故障机理、优化控制策略及设计继电保护提供了仿真依据与实践指导。

t8u9v0w1x的博客 514

WSL2+Docker实战:在Windows上部署MinerU 2.5.3,解锁媲美Demo的VLM PDF解析能力

本文详细介绍了如何在Windows系统上通过WSL2+Docker部署MinerU 2.5.3,实现媲美Demo的VLM PDF解析能力。文章涵盖环境准备、Docker部署实战技巧及高级使用技巧,特别针对PDF识别中的复杂排版、公式和图表处理提供了优化方案,帮助用户高效处理学术论文和技术文档。

weixin_29291573的博客 481

由浅入深详解四种分布式锁

分布式锁是由于单机锁无法满足分布式系统锁,在分布式环境下,需要分布式锁来控制共享内容,保证线程的安全。分布式满足几个特性互斥性超时释放锁自动续期分布式锁四种实现方式Mysql使用排它锁,。实现比较简单,但是数据库无法支撑大量请求访问,性能较差。Zookeeper先创建一个持久类型的节点,当多个线程请求时,在持久类型节点创建顺序临时节点,先判断自己是否是最小节点,如果是持有锁,执行后续逻辑,如果不是就找到上一个顺序节点,并添加watch监听事件。线程处理结束后。

m0_71777195的博客 1165

vivado:差分信号和单端信号 的相互转换 IBUFDS OBUFDS

FPGA能处理的都是单端信号,但有些输入信号是差分的,这时候就需要把差分信号转为单端信号。

qq_52137732的博客 1万+

什么是分布式锁?几种分布式锁分别是怎么实现的?

一、什么是分布式锁: 1、什么是分布式锁: 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是,分布式系统中竞争共享资源的最小粒度从线程升级成了进程。 2、分布式锁应该具备哪些条件: 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行 高可用的获取锁与释放锁 高性能的获取锁与释放锁 具备可重入特性(可理解为重新进入,由多于一个任务并发使用,而

weixin_74412978的博客 6293

dolphinscheduler-3.4.0

dolphinscheduler集群部署

docsz的博客 660

【Dumper-7】入门指南 - 带你领略不一样的UE世界

摘要: Dumper-7是一款用于分析UE4/UE5游戏的逆向工具,可自动生成游戏内部结构的C++ SDK。支持Visual Studio、CMake和Xmake三种构建方式,通过DLL注入目标游戏后,自动识别引擎结构并输出C++ SDK文件(默认保存在C:\Dumper-7目录)。该工具适用于游戏Mod开发、安全研究和机制分析,提供完整的类层次映射、属性/函数识别功能。使用时需注意x64平台配置,生成SDK后可集成到自定义DLL项目中,通过示例代码展示如何查找游戏对象、访问世界状态和调用引擎函数。

kinghzking的专栏 433

分布式锁 -- 分布式锁的种类和原理

jvm进程锁和分布式锁。

Crecendow 485

R语言使用rms包的psm函数拟合参数生存模型(parametric survival model)、并可视化列线图(诺模图、nomogram)

R语言使用rms包的psm函数拟合参数生存模型(parametric survival model)、并可视化列线图(诺模图、nomogram)

statistics+insight+vista+power 903

三种方式实现分布式锁

通过以上过程你可以发现锁的获取是按照创建时间来的,谁先来争取锁谁就先获得锁,因此它实现的是公平锁。答案是不能,以Synchronized关键字为例,Synchronized关键字无论是在偏向锁、轻量级锁还是重量级锁状态都不能实现这点,如重量级锁,重量级锁是靠系统底层的互斥量Mutex实现的,也就是说每个节点(服务器)所使用的互斥量是分开的,节点A的互斥量是无法锁住节点B的线程访问临界区,因此Synchronized关键字只能保证单服务器内的JVM进程的不同线程同步,是不能用做分布式环境中来保证线程同步。

qq_43842093的博客 1558

android 蓝牙通讯demo

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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

分布式锁的三种实现方式

目前分布式锁的实现方案主要包括三种: * 基于数据库(唯一索引) * 基于缓存(Redis,memcached,tair) * 基于Zookeeper

秃头的博客 3万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

分布式锁的三种实现

分布式锁概述 一、什么是分布式锁 普通进程锁:普通进程锁的调用者只在该进程中(或该进程的线程中),因此较为容易进行资源使用协调。在分布式环境中,不同机器的不同进程会对同一个资源进行使用/争夺,那么如何对资源的使用进行协调呢?这时就需要分布式锁来进行进程间的协调,以实现同一时刻只能有一个进程占有该资源。 分布式锁:是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作...

yesirwu的博客 316

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

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

【分布式锁】快速了解三种分布式锁的实现

首先在我们生活中锁无处不在,手机有锁,车有锁,门有锁,那锁有什么作用呢?在生活锁的作用主要是保护着我们的人生财产以及隐私安全。在计算机领域也是一样的,锁锁可以理解为针对某项资源使用权限的管理,它通常用来控制共享资源,比如一个进程内有多个线程竞争一个数据的使用权限,解决方式之一就是加锁。那分布式锁是什么呢?顾名思义,分布式锁就是分布式场景下的锁,比如多台不同机器上的进程,去竞争同一项资源,就是分布式锁。

m0_67740632的博客 1292

分布式锁有三种实现方式

分布式锁有三种实现方式: 1. 数据库乐观锁; 利用数据版本 Version 记录机制实现: 2. 基于Redis的分布式锁; SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果。缓存过期时,通过 SetNX 获取锁,如果成功了,那么更新缓存,删除锁,需要注意的是: 如果请求执行因为某些原因意外退出了,导致创建了锁但是没有删除锁,那么这个锁将一直存在,以至于以后缓存再也得不到更新。于是乎我们需要给锁加一个过期时间以防...

u010899985的博客 594

详解常见的三种分布式锁

在分布式系统中,不同的应用场景需要不同类型的分布式锁。

wangjinjin180的博客 1135

三种分布式锁的实现方式

几种实现分布式锁的方案总结

dream_xin2013的专栏 1303

seate分布式锁三种模式

介绍seate分布式锁的主要三种模式,分析三种模式的运行原理,深入浅出,更易于明白seate是如何保证事物的一致性

qq_54421200的博客 5061

【分布式锁】三种分布式锁的实现【原创】

【分布式锁】三种分布式锁的实现【原创】_一直加班的程序猿-优快云博客_分布式锁

weixin_43277501的博客 299

实现分布式锁的常用三种方式

我们的系统都是分布式部署的,日常开发中,秒杀下单、抢购商品等等业务场景,为了防⽌库存超卖,都需要用到分布式锁。分布式锁其实就是,控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共享了某个临界资源,往往需要互斥来防止彼此干扰,以保证一致性。业界流行的分布式锁实现,一般有这3种方式:基于数据库实现的分布式锁基于Redis实现的分布式锁基于Zookeeper实现的分布式锁分布式锁:基于数据库实现主要有两种方式:1、悲观锁2、乐观锁A. 悲观锁(排他锁)

2301_76166241的博客 3404

三种实现分布式锁的方式

一、为什么要使用分布式锁 我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug! 注意这是单机应用,也就是所有的请求都会分配到当前服务器的JVM内部,然后映射为操作系统的线程进行处理!而这个共享变量只是在这个JVM内部的一块内存空间! 后来业务发展,需要做集群,一个应用需要部署到几台机器上然后做负载均衡,大致如下图: 上图可以看到,变量A存在JVM1、JVM2、JVM3三个JVM内存中(这个变

周泽辉的优快云博客... 214
上一篇: 面试准备(For Me)
下一篇: 【前端】前端工程师的学习架构
It_sharp
博客等级 码龄10年 51粉丝 231原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值