分布式锁的由来、特点、及Redis分布式锁的实现详解

分布式锁特点、以及用python3实现redis分布式锁 以下是 Python3 实现 Redis 分布式锁的详细教程,包含代码示例、原理说明及最佳实践。 阅读详情

什么是分布式锁

要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。

1.线程锁

主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如Synchronized、Lock等。

2.进程锁

为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源,因此无法通过synchronized等线程锁实现进程锁。

3.分布式锁

当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。

分布式锁的由来

在传统单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLcok或synchronized)进行互斥控制。

但是在分布式系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机并发控制锁策略失效,为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁的由来。

当多个进程不在同一个系统中,就需要用分布式锁控制多个进程对资源的访问。

分布式锁的特点首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件:

1、互斥性:任意时刻,只能有一个客户端获取锁,不能同时有两个客户端获取到锁。

2、安全性:锁只能被持有该锁的客户端删除,不能由其它客户端删除。

3、死锁:获取锁的客户端因为某些原因(如down机等)而未能释放锁,其它客户端再也无法获取到该锁。

4、容错:当部分节点(redis节点等)down机时,客户端仍然能够获取锁和释放锁。

分布式锁的具体实现

高并发架构系列:什么是分布式锁?Redis实现分布式锁详解

分布式锁一般有三种实现方式:

  1. 数据库乐观锁;
  2. 基于ZooKeeper的分布式锁;
  3. 基于Redis的分布式锁;

Redis实现分布式锁

基于Redis命令:SET key value NX EX max-lock-time

这里补充下: 从2.6.12版本后, 就可以使用set来获取锁, Lua 脚本来释放锁。setnx是老黄历了,set命令nx,xx等参数, 是为了实现 setnx 的功能。

1.加锁

public class RedisTool {

private static final String LOCK_SUCCESS = “OK”;

private static final String SETIFNOT_EXIST = “NX”;

private static final String SETWITHEXPIRE_TIME = “PX”;

/**

  • 尝试获取分布式锁
  • @param jedis Redis客户端
  • @param lockKey 锁
  • @param requestId 请求标识
  • @param expireTime 超期时间
  • @return 是否获取成功
    */

public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {

String result = jedis.set(lockKey, requestId, SETIFNOTEXIST, SETWITHEXPIRETIME, expireTime);if (LOCK_SUCCESS.equals(result)) {return true;}return false;}

}

jedis.set(String key, String value, String nxxx, String expx, int time)

这个set()方法一共有五个形参:

第一个为key,我们使用key来当锁,因为key是唯一的。

第二个为value,我们传的是requestId,很多童鞋可能不明白,有key作为锁不就够了吗,为什么还要用到value?原因就是我们在上面讲到可靠性时,分布式锁要满足第四个条件解铃还须系铃人,通过给value赋值为requestId,我们就知道这把锁是哪个请求加的了,在解锁的时候就可以有依据。requestId可以使用UUID.randomUUID().toString()方法生成。

第三个为nxxx,这个参数我们填的是NX,意思是SET IF NOT EXIST,即当key不存在时,我们进行set操作;若key已经存在,则不做任何操作;

第四个为expx,这个参数我们传的是PX,意思是我们要给这个key加一个过期的设置,具体时间由第五个参数决定。

第五个为time,与第四个参数相呼应,代表key的过期时间。

总的来说,执行上面的set()方法就只会导致两种结果:1. 当前没有锁(key不存在),那么就进行加锁操作,并对锁设置个有效期,同时value表示加锁的客户端。2. 已有锁存在,不做任何操作。

2.解锁

public class RedisTool {

private static final Long RELEASE_SUCCESS = 1L;

/**

  • 释放分布式锁
  • @param jedis Redis客户端
  • @param lockKey 锁
  • @param requestId 请求标识
  • @return 是否释放成功
    */

public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {

String script = “if redis.call(‘get’, KEYS[1]) == ARGV[1] then return redis.call(‘del’, KEYS[1]) else return 0 end”;Objectresult = jedis.eval(script,Collections.singletonList(lockKey),Collections.singletonList(requestId));if(RELEASE_SUCCESS.equals(result)) {return true;}return false;}

}

那么这段Lua代码的功能是什么呢?其实很简单,首先获取锁对应的value值,检查是否与requestId相等,如果相等则删除锁(解锁)。

file

欢迎添加小编的Java学习群,不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2019年最新的Java资料和0基础入门教程视频,欢迎初学和进阶中的小伙伴。在不忙的时间我会给大家解惑

本文由博客一文多发平台 OpenWrite 发布!

架构设计之分布式锁:分布式锁的由来、及Redis分布式锁的实现详解 在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢?今天来探讨分布式锁这个话题。 什么是分布式锁 要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。 1.线程锁 主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如Synch.. 阅读详情

相关推荐

MATLAB实战:Gardner定时同步算法实现与BER曲线优化指南

本文详细介绍了Gardner定时同步算法在MATLAB中的实现与优化方法,重点解析了算法原理、关键步骤实现及BER曲线绘制中的常见问题解决方案。通过优化参数设置和系统架构,提升数字通信系统的符号同步性能,为QPSK、QAM等调制系统提供实用参考。

weixin_29085865的博客 233

什么是分布式锁? 为啥需要分布式锁?

分布式锁的由来当然是因为分布式架构的出现而产生的. 在之前的单体架构中 , 面对线程安全的问题可能使用 Java 提供 本篇文章就围绕以上三个问题来讲述分布式锁的概念. 分布式锁的由来当然是因为分布式架构的出现而产生的. 在之前的单体架构中 , 面对线程安全的问题可能使用 Java 提供的 ReentrantLcok 或 Synchronized 便足矣. 但是随着业务不断发展,这时单机满足不了,于是采用分布式部署的方式. 虽然一定程度解决了性能的瓶颈 , 但是也带来了许多分布式相关的问题. 就分布式锁而

AKALXH的博客 5329

泛微OAe9-自定义资源看板

OA中,有一个很好用的功能:会议室预约。对于一间设立的会议室,同一时间段内,肯定会有不同的人预约同一间会议室,并且,在资源看板里,能看清各个时间段会议室的占用情况,可是会议室资源是有限的,显然不可能让多个人在同一时间段内预约同一间会议室,如会议室已占用,其他人再次申请时,应当拒绝预约。

小松鼠的博客 1849

分布式锁学习

一、分布式锁的特点 互斥性:分布式锁需要保证在不同节点的不同线程的互斥 可重入性:同一个节点上的同一个线程获取锁之后,也可以再次获取这个锁 锁超时:支持锁超时,防止死锁 高效、高可用:加锁和解锁需要高效,同时也需要保证高可用防止分布式锁失效,可以增加降级 支持阻塞和非阻塞(可选):支持 lock 和 trylock 以及 tryLock(long timeOut) 支持公平锁和非公平锁(可选):公平锁指按照请求加锁的顺序获得锁,非公平锁则相反是无序获取锁 二、实现方式 1、基于 mysql 实现 基于

yin__ren的博客 1083

Jupyter地铁数据分析预测地铁后7天小时客流量

地铁数据分析 基于八月地铁刷卡数据,以前23天的数据作为训练数据,预测后7天各个地铁站点在6点—23点每个小时的客流量。 import pandas as pd import time import numpy as np import matplotlib.pyplot as plt ...

qq_45868915的博客 1754

World Creator地形导入UE

导出预设选择高度图(heigh map)格式选择PNG 16位,或者RAW 16位,需要反转y轴(与虚幻不同),命名格式会自动带一个× , 将×改成_ 或者删掉自己命名 (虚幻名称不支持x符号)导入虚幻 , 修改Z轴 , 就是用 地形最高 - 地形最低 , 然后除以512 , 再乘以100。把这个数字填入Z轴缩放 , 点击生成即可。

UE星空 2155

分布式锁特性

分布式锁

mywaya2333的博客 471

MATLAB Appdesigner开发独立桌面App全流程(一):以打开串口功能为例介绍Appdesigner的基本使用

本文详细介绍了Appdesigner的基本使用,以串口功能为例介绍按钮回调函数的实现以及控件之间通信的问题

Zhuwany的博客 3万+

基于Zookeeper实现多进程分布式锁

一、zookeeper简介及基本操作 Zookeeper并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。当对目录节点监控状态打开时,一旦目录节点的状态发生变化,Watcher对象的process方法就会被调用。 创建Zookeeper实例时即可绑定一个Watcher对象,如 ZooKeeperzk = new ZooKeeper(zookeep...

weixin_30883777的博客 336

《物联网技术》课程笔记——第二章 物联网技术架构

文章目录第二章:物联网技术架构1 物联网技术体系(C3SD)2 系统体系结构的基本概念3 物联网体系结构——信息传递视角3.1物联网感知层3.1.1 感知层要解决的问题3.1.2 感知层的形态3.1.3 节点的感知能力与控制能力3.1.4 感知层实例3.2 物联网网络层3.2.1 网络相关概念3.2.2 IPV6与IPV4相比互联网协议的升级3.2.3 计算机网络的逻辑层次3.2.4 传输网的拓扑结构3.2.4.1 举例:智能小区的三表采集系统3.2.4.2 接入层3.2.4.2 汇聚层3.2.4.2 核心

南京大学软件工程硕士在读 2503

避坑指南:ZYNQ平台上AXI 1G/2.5G Ethernet Subsystem实现IEEE1588的5个关键点

本文详细解析了在ZYNQ平台上使用AXI 1G/2.5G以太网子系统实现IEEE1588精密时间协议(PTP)的5个关键避坑点。从硬件选型、Vivado工程配置到Linux驱动适配,提供了实战经验与优化技巧,帮助工程师在工业自动化、电力系统等场景中实现纳秒级时间同步。

weixin_30687051的博客 239

一文搞懂分布式锁及其业务场景

为什么用分布式锁? 在讨论这个问题之前,我们先来看一个业务场景: 系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户下单。 由于系统有一定的并发,所以会预先将商品的库存保存在redis中,用户下单的时...

chunqiu3351的博客 2万+

西门子S7-1200PLC与FANUC机器人进行PROFINET IO通信的具体方法和步骤详解

西门子S7-1200PLC与FANUC机器人进行PROFINET IO通信的具体方法和步骤详解

Robot_PLC_HMI_Automation 1万+

Redis(10)分布式锁的由来、特点、及Redis分布式锁的实现详解

在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢?今天来探讨分布式锁这个话题。 什么是分布式锁 要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。 1.线程锁 主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同...

cowbin2012的专栏 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

高并发架构系列:分布式锁的由来、特点及Redis分布式锁的实现详解

在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢?今天来探讨分布式锁这个话题。 什么是分布式锁 要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。 1.线程锁 主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同...

mikechen的互联网架构 426

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

高并发架构系列:分布式锁的由来、特点及Redis分布式锁的实现详解 ...

在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢?今天来探讨分布式锁这个话题。 什么是分布式锁 要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。 1.线程锁 主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅...

weixin_34378767的博客 88

Redis核心数据结构与分布式锁实现详解

Redis核心数据结构与分布式锁实现摘要 本文详细介绍了Redis的常用数据结构(字符串、哈希、列表、集合、有序集合)及其应用场景,并提供了Python操作示例。重点讲解了基于Redis的分布式锁实现方案,包括基本SETNX命令、SET扩展命令以及Redlock算法三种实现方式。分布式锁需要满足互斥性、避免死锁、容错性和自旋等待等要求。文章通过代码示例展示了如何获取和释放锁,并分析了不同方案的优缺点。Redis因其丰富的数据结构和原子性操作,成为实现分布式系统协调的理想选择。

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 2225

使用 Redis 实现分布式锁,解决分布式锁原子性、死锁、误删、可重入、自动续期等问题(使用SpringBoot环境实现)

使用 Redis 实现分布式锁,解决分布式锁原子性、死锁、误删、可重入、自动续期等问题(使用SpringBoot环境实现)

kerwin的博客 1万+

Redis系列教程(八):分布式锁的由来、及Redis分布式锁的实现详解

在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢?今天来探讨分布式锁这个话题。 什么是分布式锁 要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。 1.线程锁 主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如Sy...

一个有情怀的程序猿博客 559

Redis(九) - Redis之分布式锁

Redis(九) - Redis之分布式锁

及时当勉励,岁月不待人 1万+

MySQL和Redis实现分布式锁

MySQL和Redis实现分布式锁1. 为何需要分布式锁2. 分布式锁的一些特点3. 常见的分布式锁4. Mysql实现分布式锁4.1 lock()4.2 tryLock()和tryLock(long timeout)4.3 unlock()4.4 锁超时4.5 MySQL实现方式小结4.6 乐观锁5. Redis实现分布式锁5.1 使用setnx实现5.2 使用Redission来实现5.3 R...

Lzc的博客 2991
上一篇: Redis的内存回收原理,及内存过期淘汰策略详解
下一篇: Redis并发竞争key的解决方案详解
JavaAQA
博客等级 码龄7年 1粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值