一篇文章带你解读Redis分布式锁的发展史和正确实现方式

带你解读Redisson分布式锁的源码 前言 虽说是一时兴起,但仔细研究之后发现Redisson的源码解读工作量还是挺大的,其中用到了大量的Java并发类,并且引用了Netty作为通信工具,实现与Redis组件的远程调用,这些知识点如果要全部讲解的话不太现实,本文的重点主要是关于Redisson分布式锁的实现原理,所以网络通信和并发原理这块的代码解读不会太仔细,有不足之处还望见谅! Redis 发布订阅 之前说过,分布式锁的核心功能其实就三个:加锁、解锁、设置锁超时。这三个功能也是我们研究Redisson分布式锁原理的方向。 在学习之前, 阅读详情

前言

近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布式实现方式为Redis,Zookeeper,其中基于Redis的分布式锁的使用更加广泛。

但是在工作和网络上看到过各个版本的Redis分布式锁实现,每种实现都有一些不严谨的地方,甚至有可能是错误的实现,包括在代码中,如果不能正确的使用分布式锁,可能造成严重的生产环境故障,本文主要对目前遇到的各种分布式锁以及其缺陷做了一个整理,并对如何选择合适的Redis分布式锁给出建议。

 

各个版本的Redis分布式锁

V1.0

tryLock(){  
    SETNX Key 1
    EXPIRE Key Seconds
}
release(){  
  DELETE Key
}

这个版本应该是最简单的版本,也是出现频率很高的一个版本,首先给锁加一个过期时间操作是为了避免应用在服务重启或者异常导致锁无法释放后,不会出现锁一直无法被释放的情况。

这个方案的一个问题在于每次提交一个Redis请求,如果执行完第一条命令后应用异常或者重启,锁将无法过期,一种改善方案就是使用Lua脚本(包含SETNX和EXPIRE两条命令),但是如果Redis仅执行了一条命令后crash或者发生主从切换,依然会出现锁没有过期时间,最终导致无法释放。

另外一个问题在于,很多同学在释放分布式锁的过程中,无论锁是否获取成功,都在finally中释放锁,这样是一个锁的错误使用,这个问题将在后续的V3.0版本中解决。

针对锁无法释放问题的一个解决方案基于GETSET命令来实现

 

V1.1 基于GETSET

tryLock(){  
    NewExpireTime=CurrentTimestamp+ExpireSeconds
    if(SETNX Key NewExpireTime Seconds){
         oldExpireTime = GET(Key)
          if( oldExpireTime < CurrentTimestamp){
              NewExpireTime=CurrentTimestamp+ExpireSeconds
              CurrentExpireTime=GETSET(Key,NewExpireTime)
              if(CurrentExpireTime == oldExpireTime){
                return 1;
              }else{
                return 0;
              }
          }
    }
}
release(){  
        DELETE key
    }

思路:

(1)SETNX(Key,ExpireTime)获取锁

(2)如果获取锁失败,通过GET(Key)返回的时间戳检查锁是否已经过期

(3)GETSET(Key,ExpireTime)修改Value为NewExpireTime

(4)检查GETSET返回的旧值,如果等于GET返回的值,则认为获取锁成功

注意:这个版本去掉了EXPIRE命令,改为通过Value时间戳值来判断过期

问题:

(1)在锁竞争较高的情况下,会出现Value不断被覆盖,但是没有一个Client获取到锁

(2)在获取锁的过程中不断的修改原有锁的数据,设想一种场景C1,C2竞争锁,C1获取到了锁,C2锁执行了GETSET操作修改了C1锁的过期时间,如果C1没有正确释放锁,锁的过期时间被延长,其它Client需要等待更久的时间

 

V2.0 基于SETNX

tryLock(){  
    SETNX Key 1 Seconds
}
release(){  
  DELETE Key
}

Redis 2.6.12版本后SETNX增加过期时间参数,这样就解决了两条命令无法保证原子性的问题。但是设想下面一个场景:

(1)C1成功获取到了锁,之后C1因为GC进入等待或者未知原因导致任务执行过长,最后在锁失效前C1没有主动释放锁

(2)C2在C1的锁超时后获取到锁,并且开始执行,这个时候C1和C2都同时在执行,会因重复执行造成数据不一致等未知情况

(3)C1如果先执行完毕,则会释放C2的锁,此时可能导致另外一个C3进程获取到了锁

大致的流程图

存在问题:
(1)由于C1的停顿导致C1 和C2同都获得了锁并且同时在执行,在业务实现间接要求必须保证幂等性

(2)C1释放了不属于C1的锁

 

V3.0

tryLock(){  
    SETNX Key UnixTimestamp Seconds
}
release(){  
    EVAL(
      //LuaScript
      if redis.call("get",KEYS[1]) == ARGV[1] then
          return redis.call("del",KEYS[1])
      else
          return 0
      end
    )
}

这个方案通过指定Value为时间戳,并在释放锁的时候检查锁的Value是否为获取锁的Value,避免了V2.0版本中提到的C1释放了C2持有的锁的问题;另外在释放锁的时候因为涉及到多个Redis操作,并且考虑到Check And Set 模型的并发问题,所以使用Lua脚本来避免并发问题。

存在问题:

如果在并发极高的场景下,比如抢红包场景,可能存在UnixTimestamp重复问题,另外由于不能保证分布式环境下的物理时钟一致性,也可能存在UnixTimestamp重复问题,只不过极少情况下会遇到。

 

V3.1

tryLock(){  
    SET Key UniqId Seconds
}
release(){  
    EVAL(
      //LuaScript
      if redis.call("get",KEYS[1]) == ARGV[1] then
          return redis.call("del",KEYS[1])
      else
          return 0
      end
    )
}

Redis 2.6.12后SET同样提供了一个NX参数,等同于SETNX命令,官方文档上提醒后面的版本有可能去掉SETNX, SETEX, PSETEX,并用SET命令代替,另外一个优化是使用一个自增的唯一UniqId代替时间戳来规避V3.0提到的时钟问题。

这个方案是目前最优的分布式锁方案,但是如果在Redis集群环境下依然存在问题:

由于Redis集群数据同步为异步,假设在Master节点获取到锁后未完成数据同步情况下Master节点crash,此时在新的Master节点依然可以获取锁,所以多个Client同时获取到了锁

 

分布式Redis锁:Redlock

V3.1的版本仅在单实例的场景下是安全的,针对如何实现分布式Redis的锁,国外的分布式专家有过激烈的讨论, antirez提出了分布式锁算法Redlock,在distlock话题下可以看到对Redlock的详细说明,下面是Redlock算法的一个中文说明(引用)

假设有N个独立的Redis节点

1、获取当前时间(毫秒数)。

2、按顺序依次向N个Redis节点执行获取锁的操作。这个获取操作跟前面基于单Redis节点的获取锁的过程相同,包含随机字符串my_random_value,也包含过期时间(比如PX 30000,即锁的有效时间)。

为了保证在某个Redis节点不可用的时候算法能够继续运行,这个获取锁的操作还有一个超时时间(time out),它要远小于锁的有效时间(几十毫秒量级)。客户端在向某个Redis节点获取锁失败以后,应该立即尝试下一个Redis节点。

这里的失败,应该包含任何类型的失败,比如该Redis节点不可用,或者该Redis节点上的锁已经被其它客户端持有(注:Redlock原文中这里只提到了Redis节点不可用的情况,但也应该包含其它的失败情况)。

3、计算整个获取锁的过程总共消耗了多长时间,计算方法是用当前时间减去第1步记录的时间。如果客户端从大多数Redis节点(>= N/2+1)成功获取到了锁,并且获取锁总共消耗的时间没有超过锁的有效时间(lock validity time),那么这时客户端才认为最终获取锁成功;否则,认为最终获取锁失败。

4、如果最终获取锁成功了,那么这个锁的有效时间应该重新计算,它等于最初的锁的有效时间减去第3步计算出来的获取锁消耗的时间。

5、如果最终获取锁失败了(可能由于获取到锁的Redis节点个数少于N/2+1,或者整个获取锁的过程消耗的时间超过了锁的最初有效时间),那么客户端应该立即向所有Redis节点发起释放锁的操作(即前面介绍的Redis Lua脚本)。

6、释放锁:对所有的Redis节点发起释放锁操作

然而Martin Kleppmann针对这个算法提出了质疑,提出应该基于fencing token机制(每次对资源进行操作都需要进行token验证)

(1)Redlock在系统模型上尤其是在分布式时钟一致性问题上提出了假设,实际场景下存在时钟不一致和时钟跳跃问题,而Redlock恰恰是基于timing的分布式锁

(2)另外Redlock由于是基于自动过期机制,依然没有解决长时间的gc pause等问题带来的锁自动失效,从而带来的安全性问题。

接着antirez又回复了Martin Kleppmann的质疑,给出了过期机制的合理性,以及实际场景中如果出现停顿问题导致多个Client同时访问资源的情况下如何处理。

针对Redlock的问题,基于Redis的分布式锁到底安全吗给出了详细的中文说明,并对Redlock算法存在的问题提出了分析。

 

总结

不论是基于SETNX版本的Redis单实例分布式锁,还是Redlock分布式锁,都是为了保证以下特性

(1)安全性:在同一时间不允许多个Client同时持有锁

(2)活性 死锁:锁最终应该能够被释放,即使Client端crash或者出现网络分区(通常基于超时机制) 容错性:只要超过半数Redis节点可用,锁都能被正确获取和释放

所以在开发或者使用分布式锁的过程中要保证安全性和活性,避免出现不可预测的结果。

另外每个版本的分布式锁都存在一些问题,在锁的使用上要针对锁的实用场景选择合适的锁,通常情况下锁的使用场景包括:

(1)Efficiency(效率):只需要一个Client来完成操作,不需要重复执行,这是一个对宽松的分布式锁,只需要保证锁的活性即可;

(2)Correctness(正确性):多个Client保证严格的互斥性,不允许出现同时持有锁或者对同时操作同一资源,这种场景下需要在锁的选择和使用上更加严格,同时在业务代码上尽量做到幂等

在Redis分布式锁的实现上还有很多问题等待解决,我们需要认识到这些问题并清楚如何正确实现一个Redis 分布式锁,然后在工作中合理的选择和正确的使用分布式锁。

 

Redisson分布式锁实现原理的总结了一张图

 

最后

欢迎大家关注我的公种浩【程序员追风】,整理了1000道2019年多家公司java面试题400多页pdf文档,文章都会在里面更新,整理的资料也会放在里面。喜欢文章记得关注我点个赞哟,感谢支持!

使用Redis数据库实现分布式锁 在分布式系统中,多个进程或服务可能会同时访问和修改共享资源,为了保证数据的一致性和正确性,需要引入分布式锁机制。本文章的目的是详细介绍如何使用Redis数据库来实现分布式锁,涵盖了从核心概念到实际应用的各个方面,包括算法原理、代码实现、应用场景分析等,帮助读者掌握使用Redis实现分布式锁的技术。本文将按照以下结构进行组织:首先介绍分布式锁和Redis的相关核心概念及它们之间的联系;接着阐述使用Redis实现分布式锁的核心算法原理和具体操作步骤,并给出Python代码示例; 阅读详情

相关推荐

最新小旋风蜘蛛池X6.21解密版+绕过授权带教程

介绍: 1.站群管理:用你的域名在这里添加网站 2.站点优化:站点互链,内容优化 2.系统设置:开启蜘蛛池 3.采集管理(可开启自动采集) 4.缓存设置:推荐开启tkd缓存 其他的用户根据自己的实际情况后台进行配置,通常以下: 1.后台首页(这里显示系统的大致概况) 2.系统设置:蜘蛛池的基本设置(访问开关、跳转、统计等等) 3.站群管理: 1.网站管理(用你的域名在这里添加网站) 2.模型管理(可构建不同类型站点:电影、文章、论坛等等) 3.TKDB调用模板(即:title、keywords、descri

百度SEO程序下载 2936

Redis入门——发展历程及NoSQL

前言 随着社会的发展,数据存储经历了诸多的过程,这篇文章就是介绍Redis的发展由来: 1、单机Mysql时代 这种模式存在以下的瓶颈: 数据量太大,一个机器存放不下 数据的索引太大,一个机器的内存放不下 访问量(读写混合)太大,一个服务器承受不住 在这之后,我们试着做一些优化,比如: 优化数据结构和索引——>文件缓存IO——>Memcached 2、 缓存Memcachaed+读写分离(垂直拆分) 网站上80%的情况都是在读,每次都去查询数据库,效率很低。这时候可以加入缓存机制,第一次查

qq_44824574的博客 900

别再对着数据手册画图了!用HFSS 2023 R2快速复现ESP-01的PCB天线(附模型文件)

本文详细介绍了使用HFSS 2023 R2逆向复现ESP-01 PCB天线的五个关键步骤,包括逆向工程准备、高效建模技巧、材料与边界设置、激励与求解配置以及结果分析与设计验证。通过参数化建模和智能边界检测,大幅提升仿真效率,适用于WIFI和蓝牙设备的射频设计优化。

weixin_30832143的博客 76

一篇文章带你了解Redis的发展史

分库分表和 MySQL 集群时代(2000年代后期至2010年代初期):随着业务和技术的不断发展,数据库系统面临的挑战也越来越大。然而,随着数据量的增长和访问量的增加,数据库系统面临着一些挑战,例如索引的大小和并发访问的性能问题。传统的关系型数据库已经无法满足需求,因此人们开始转向 NoSQL 数据库,Redis 是其中发展最快的一个。Redis 是一个开源的内存数据存储和处理系统,它在过去的几十年中经历了重大的发展和演进。它的发展和演进为数据库系统的设计和实现提供了宝贵的经验和启示。

Java高知社区 1298

Unity 多线程编程笔记 _Task详解

士大夫

weixin_43405845的博客 4384

从零开始:用Kimi API和LangChain打造智能写作助手

本文详细介绍了如何从零开始,利用Kimi API提供的强大AI大模型能力,结合LangChain框架构建一个智能写作助手。通过实战演示了环境搭建、核心写作链构建、以及引入检索增强生成和智能体等进阶功能,旨在解决长文档创作、事实准确性等痛点,打造一个能理解意图、调用工具并保持记忆的智能创作伙伴。

weixin_29294395的博客 138

Redis入门——Nosql概述

目录一、Nosql概述 为什么使用Nosql 什么是Nosql Nosql特点 阿里巴巴演进分析 Nosql的四大分类 一、Nosql概述  为什么使用Nosql   1、单机Mysql时代   90年代,一个网站的访问量一般不会太大,单个数据库完全够用。随着用户增多,网站出现以下问题   数据量增加到一定程度,单机数据库就放不下了   数据的索引(B+ Tree),一个机器内存也存放不下   访问量变大后(读写混合),一台服务器承受不住。   2、Memcached(缓存) + Mysql + 垂直拆分

qq_42446156的博客 708

别再让步进电机‘发烧’了!用FOC闭环驱动实现精准力矩控制(基于P0斩波恒流版)

本文详细介绍了如何利用FOC闭环驱动技术(基于P0斩波恒流版)解决步进电机过热和力矩控制不精准的问题。通过对比传统开环控制的缺陷,展示了FOC在降低温度、提升精度和能效方面的显著优势,并提供了硬件配置、软件实现及性能优化的完整方案。

weixin_30872157的博客 567

redis-01-redis发展历程及单线程多线程

redis高级篇之单线程多线程

ycmy2017的博客 297

SpringBoot + MyBatis-Plus 高效实现数据变更记录:从注解到通用审计方案(附源码)

*** 数据变更审计插件* 拦截增删改操作,自动记录变更日志*/@Component@Resource/*** 拦截SQL执行*/@Override/*** 数据变更审计插件* 拦截增删改操作,自动记录变更日志/*** 拦截SQL执行。

2601_94871597的博客 558

产品路线图的三种模型(RICE/MoSCoW/Kano),教你如何对需求进行优先级排序

RICE/MoSCoW/Kano三种模型,教你如何对需求进行优先级排序。 也许你会让业务提供一份ROI,记得前不久参加过一场立项会评审,一位很有意思的小产品在会上讲不清楚ROI,评审们要求会后重新梳理,小产品表达不要为难业务方干一些他们不擅长的事了。这个看似笑话的经历,背后隐藏着价值判断已经流于形式。 也许你会要求业务方直接给出需求优先级列表,把任务分为P0到P5,这样的划分除了按需求本质的优先级还同时考虑了开发资源、开发难度等问题。毫不夸张地说,我曾经拿到一张全是P0级别的需求清单,如果一切任务都是高

wenyusuran的专栏 5540

redis基础1——发展历程+源码安装及配置+基本常识

从项目视角触发,讲解redis的背景由来,常规安装,核心配置参数测试解析,以及redis常识,带你走入高级领域。

百慕卿君博客 2285

位置点位到达判断FC(Easy+Codesys+博途平台)

IN rActPositon REAL 轴当前实际位置 1IN arAbsPosition REAL[10] 各工作点位坐标 2IN rDeadZone REAL 位置达到判断域值 范围 3OUT abInAbsPos BOOL[10] 到达各绝对定位点位标志 位置到达输出 4VAR i INT 循环计数 5VAR rErr REAL 位置偏差 6。

RXXW_Dor的博客 536

一个项目部署多个节点会导致锁失效么_一篇文章带你解读redis分布式锁的发展史和正确实现方式...

前言近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布式实现方式为Redis,Zookeeper,其中基于Redis的分布式锁的使用更加广泛。但是在工作和网络上看到过各个版本的Redis分布式锁实现,每种实现都有一些不严谨的地方,甚至有可能是错误的实现,包括在代码中,如果不能...

weixin_39949473的博客 121

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

阿里p7带你解读redis分布式锁的发展史和正确实现方式

前言 近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布式实现方式为Redis,Zookeeper,其中基于Redis的分布式锁的使用更加广泛。 但是在工作和网络上看到过各个版本的Redis分布式锁实现,每种实现都有一些不严谨的地方,甚至有可能是错误的实现,包括在代码...

编程爬阶小马的博客 282

VC中sqlite的使用

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

手撸Redis分布式锁(8个版本的渐进式源码实践解读)

与分布式锁相对应的是本地锁,像我们熟悉的synchronized和ReentrantLock都是本地锁,本地锁是作用于JVM内部,单个进程内的操作共享资源互斥。而现在主流都是分布式和微服务架构,会部署多个服务(多个JVM),为此分布式锁也就应运而生了。分布式锁主流实现有3种:基于Redis、Zookeeper或Mysql等数据库。Redis实现分布式锁使用得非常广泛,也是面试的重要考点之一,很多同学都知道这个知识,也大致知道分布式锁的原理,但是具体到细节的掌握上,往往并不完全正确。

天罡gg的专栏 6281

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Redisson实现Redis分布式锁的原理分析

目录 一、写在前面 二、Redisson实现Redis分布式锁的底层原理 1、加锁机制 2、锁互斥机制 3、watch dog自动延期机制 4、可重入加锁机制 一、写在前面 现在面试,一般都会聊聊分布式系统这块的东西。通常面试官都会从服务框架(Spring Cloud、Dubbo)聊起,一路聊到分布式事务、分布式锁、ZooKeeper等知识。 所以咱们这篇文章就来聊聊分布式锁这块知识,具体的来看看Redis分布式锁的实现原理。 说实话,如果在公司里落地生产环境用分布式锁的时候,一定是会用

骏马逸动,心随你动的博客 9079

redis分布式锁&redisson

利用set nx ex获取锁,并设置过期时间,保存线程标示释放锁时先判断线程标示是否与自己一致,一致则删除锁利用set nx满足互斥性利用set ex保证故障时锁依然能释放,避免死锁,提高安全性利用Redis集群保证高可用和高并发特性Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。

pscool的博客 3175

Redis实现分布式锁详细解读

我们在学多线程的时候遇到过,这种锁主要应用于多线程竞争资源。如果是多进程竞争资源的话就需要引入分布式锁的概念了。比如在微服务架构中,多个用户进程修改同一条数据且只能有一个用户修改成功,就需要用到分布式锁,今天我们就来讲讲如何用redis来实现分布式锁。

每周更新,热爱coding! 1128

Redis实现分布式锁

上面的操作看似已经解决了分布式锁的潜在问题,但其实还有一种极端情况,当线程A执行到释放锁的业务后,判断当前锁就是自己的锁,正准备删除,但此时设置的锁的自动释放时间恰好到期,redis自己将锁删除了,线程B又可以获取到锁了,但此时删锁的业务还是需要执行,于是线程A就又把线程B的锁给删了,于是就再次出现了误删问题。出现这种问题的原因在于线程无法判断当前删除的锁是不是自己的锁,只需要在删除之前再加一段判断逻辑,判断当前需要删除的锁是不是自己的锁,是就删除,不是就不做处理。出现问题的根本原因其实还是代码的。

2401_89221704的博客 1194

如何使用 Redis 快速实现分布式锁?

Redis 作为一种高性能的内存数据库,可以快速实现分布式锁。通过使用 SETNX 命令和 EXPIRE 命令,可以实现一个简单的分布式锁。在使用分布式锁时,要注意锁的过期时间设置、锁的释放以及 Redis 的可用性等问题。同时,也要认识到分布式锁在应用中的优缺点,根据实际情况选择合适的分布式锁实现方案。并且,在高并发场景下的数据一致性、分布式任务调度以及分布式事务中的资源锁定等场景中,Redis 分布式锁都能发挥重要作用。

2401_89221445的博客 1177

【Redis】4.万字文章带你深入Redisson与源码解读(建议收藏)

在前面【Redis】3.详解分布式锁解决了误删锁和原子性的问题但是不难发现,还存在一个问题,会导致锁不住。当锁的过期时间到了时候,锁就会被释放掉。这时候如果线程1因为阻塞还未向数据库插入订单数据,锁就被释放了,线程2就会获取锁,进行业务逻辑,这就导致锁不住。因此,当过期时间到了之后,业务逻辑还没执行完的时候,我们应该给这把锁续费,就不会出现这种问题了,这个续费问题该怎么解决呢?这就需要用到Redisson了。

沉迷写代码的程序猿的博客 5121

解读分布式锁

概述 为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁。 为什么要使用分布式锁 成员变量 A 存在 JVM1、JVM2、JVM3 三个 JVM 内存中 成员变量 A 同时都会在 JVM 分配一块内存,三个请求发过来同时对这个变量操作,显然结果是不对的 不是同时发过来,三个请求分别操作三个不同 ...

一个天秤座的架构师 2万+

如何使用redis实现分布式锁

对于生产环境,建议使用成熟的库(如Redisson)或算法(如RedLock),以减少实现复杂度并提高可靠性。

qq_57756904的博客 741

分布式锁—1.原理算法和使用建议二

获取到锁的线程会通过zk.delete()方法来删除其对应的节点实现释放锁,在等候获取锁的线程掉线时其对应的节点也会被删除。Redisson支持很多种复杂的锁的语义,提供了各种分布式锁的高级支持,Redisson这个客户端框架本身就有完整的一套Redis分布式锁实现。对于zk分布式锁,获取锁时创建的是临时节点,即便客户端挂了,由于临时节点会被zk删除,所以会自动释放锁。如果业务场景要求锁的语义健壮稳定,不能出现多客户端同时加到一把锁,且对锁的功能没有特别需求,那么可以使用zk分布式锁。

mjunz的博客 1127

基于redis实现分布式锁介绍

基于redis实现分布式锁介绍 文章目录基于redis实现分布式锁介绍前言1. 基于Jedis实现分布式锁2. 基于Redisson实现可重入锁3. 关于Redisson分布式锁的争论 前言 本文主要用于介绍常规分布式锁的使用及其原理,在主篇中进行了常规分布式锁的扫盲介绍,在子篇中介绍了现主流分布式锁的源码以及自写学习demo解析。 文章主要分为以下两个部分: 主篇: 1、常规分布式锁的扫盲介绍 子篇: 1、基于mysql实现的分布式锁原理及自写案例学习代码介绍(包括锁表、乐观锁、悲观锁 2、基于zoo

weixin_43900244的博客 647
上一篇: 一篇文章看清楚JDK13的特性!
下一篇: 2019年Java并发精选面试题,哪些你还不会?(含答案和思维导图)
程序员追风
程序员追风 优质创作者: Java技术领域 优质创作者: Java技术领域
博客等级 码龄7年 9635粉丝 237原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值