当前位置:网站首页>Redis的分布式锁
Redis的分布式锁
2022-07-27 20:51:00 【果子哥丶】
分布式锁三种实现方式:
- 基于数据库实现分布式锁;
- 基于缓存(Redis等)实现分布式锁;
- 基于Zookeeper实现分布式锁;
- 文章:https://www.cnblogs.com/xiaozengzeng/p/12641153.html
基于缓存(Redis等)实现分布式锁
- 使用命令介绍:
(1)SETNX
SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。
(2)expire
expire key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。
(3)delete
delete key:删除key
在使用Redis实现分布式锁的时候,主要就会使用到这三个命令。
- 实现思想:
(1)获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。
(2)获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。
(3)释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。
Redis 锁主要利用 Redis 的 setnx 命令。
- 加锁命令:SETNX key value,当键不存在时,对键进行设置操作并返回成功,否则返回失败。KEY 是锁的唯一标识,一般按业务来决定命名。
- 解锁命令:DEL key,通过删除键值对释放锁,以便其他线程可以通过 SETNX 命令来获取锁。
- 锁超时:EXPIRE key timeout, 设置 key 的超时时间,以保证即使锁没有被显式释放,锁也可以在一定时间后自动释放,避免资源被永远锁住。
if (setnx(key, 1) == 1){
expire(key, 30)
try {
//TODO 业务逻辑
} finally {
del(key)
}
}
一、什么是分布式锁?
要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。
线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如synchronized是共享对象头,显示锁Lock是共享某个变量(state)。
进程锁:为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源,因此无法通过synchronized等线程锁实现进程锁。
分布式锁:当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。
我们在系统中修改已有数据时,需要先读取,然后进行修改保存,此时很容易遇到并发问题。由于修改和保存不是原子操作,在并发场景下,部分对数据的操作可能会丢失。在单服务器系统我们常用本地锁来避免并发带来的问题,然而,当服务采用集群方式部署时,本地锁无法在多个服务器之间生效,这时候保证数据的一致性就需要分布式锁来实现。
原子性:即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。
我们在系统中修改已有数据时,需要先读取,然后进行修改保存,此时很容易遇到并发问题。由于修改和保存不是原子操作,**在并发场景下,部分对数据的操作可能会丢失。**在单服务器系统我们常用本地锁来避免并发带来的问题,然而,当服务采用集群方式部署时,本地锁无法在多个服务器之间生效,这时候保证数据的一致性就需要分布式锁来实现。
https://segmentfault.com/a/1190000038330434
Redis分布式锁
Redis 锁主要利用 Redis 的 setnx 命令。
- 加锁命令:SETNX key value,当键不存在时,对键进行设置操作并返回成功,否则返回失败。KEY 是锁的唯一标识,一般按业务来决定命名。
- 解锁命令:DEL key,通过删除键值对释放锁,以便其他线程可以通过 SETNX 命令来获取锁。
- 锁超时:EXPIRE key timeout, 设置 key 的超时时间,以保证即使锁没有被显式释放,锁也可以在一定时间后自动释放,避免资源被永远锁住。
if (setnx(key, 1) == 1){
expire(key, 30)
try {
//TODO 业务逻辑
} finally {
del(key)
}
}
边栏推荐
猜你喜欢

西门子PLC能否实时无线采集多处从站模拟量数据?
Software test function test full set of common interview questions [function test] interview summary 4-2

远程调试 idea配置remote debug、在远程服务器的程序中,添加JVM启动参数-Xdebug

一位软件投资者的独白:我为什么不追逐快速增长的公司

Record the errors about formatc in R language

Can Siemens PLC collect analog data of multiple slave stations in real time and wirelessly?

Normality of confidence interval

如何快捷地查看H.265视频播放器EasyPlayer的API属性及其使用方法?

MapReduce(三)

营收、利润两位数增长,华润怡宝悄悄打造了这些过亿新品
随机推荐
Application skills of AWS dynamodb
XML external entity (xxE) vulnerability and its repair method
看GAN如何一步步控制图像生成风格?详解StyleGAN进化过程
Software test function test full set of common interview questions [function test] interview summary 4-2
JUC工具包学习
西门子PLC能否实时无线采集多处从站模拟量数据?
In 2019, the world's top ten semiconductor manufacturers: Intel returned to the first place, and apple rose sharply against the trend
2022夏暑假每日一题(五)
初步了解Panda3D音频和高级交互组件
The principle and demonstration of service path lifting without quotation marks
[signal denoising] signal denoising based on Kalman filter with matlab code
Pentium快速系统调用学习
【软考软件评测师】2014综合知识历年真题
Record the errors about formatc in R language
Exercise --- BFS
CaEGCN: Cross-Attention Fusion based Enhanced Graph Convolutional Network for Clustering 2021
【GNN报告】加拿大蒙特利尔唐建:Geometric Deep Learning For Drug Discovery
sort排序
详解分布式系统的幂等
寻找和利用 XXE – XML 外部实体注入