iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Redisson中怎么实现Redis分布式锁
  • 947
分享到

Redisson中怎么实现Redis分布式锁

2023-06-20 19:06:12 947人浏览 八月长安
摘要

Redisson中怎么实现Redis分布式锁,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Redis几种架构Redis发展到现在,几种常见的部署架构有:单机模式;主从模式;

Redisson中怎么实现Redis分布式,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

Redis几种架构

Redis发展到现在,几种常见的部署架构有:

  • 单机模式;

  • 主从模式;

  • 哨兵模式;

  • 集群模式;

我们首先基于这些架构讲解Redisson普通分布式锁实现,需要注意的是,只有充分了解普通分布式锁是如何实现的,才能更好的了解Redlock分布式锁的实现,因为Redlock分布式锁的实现完全基于普通分布式锁。

普通分布式锁

Redis普通分布式锁这个大家基本上只了解,本文不打算过多的介绍,上一篇文章《Redlock:Redis分布式锁最牛逼的实现》也讲的很细,并且也说到了几个重要的注意点。

所以直接show you the code,毕竟talk is cheap。

redisson版本

本次测试选择redisson 2.14.1版本。

单机模式

源码如下:

// 构造redisson实现分布式锁必要的ConfiGConfig config = new Config();config.useSingleServer().setAddress("redis://172.29.1.180:5379").setPassword("a123456").setDatabase(0);// 构造RedissonClientRedissonClient redissonClient = Redisson.create(config);// 设置锁定资源名称RLock disLock = redissonClient.getLock("DISLOCK");boolean isLock;try {    //尝试获取分布式锁    isLock = disLock.tryLock(500, 15000, TimeUnit.MILLISECONDS);    if (isLock) {        //TODO if get lock success, do something;        Thread.sleep(15000);    }} catch (Exception e) {} finally {    // 无论如何, 最后都要解锁    disLock.unlock();}

通过代码可知,经过Redisson的封装,实现Redis分布式锁非常方便,我们再看一下Redis中的value是啥,和前文分析一样,hash结构,key就是资源名称,field就是UUID+threadId,value就是重入值,在分布式锁时,这个值为1(Redisson还可以实现重入锁,那么这个值就取决于重入次数了):

172.29.1.180:5379> hgetall DISLOCK1) "01a6d806-d282-4715-9bec-f51b9aa98110:1"2) "1"

哨兵模式

即sentinel模式,实现代码和单机模式几乎一样,唯一的不同就是Config的构造:

Config config = new Config();config.useSentinelServers().addSentinelAddress(        "redis://172.29.3.245:26378","redis://172.29.3.245:26379", "redis://172.29.3.245:26380")        .setMasterName("mymaster")        .setPassword("a123456").setDatabase(0);

集群模式

集群模式构造Config如下:

Config config = new Config();config.useClusterServers().addnodeAddress(        "redis://172.29.3.245:6375","redis://172.29.3.245:6376", "redis://172.29.3.245:6377",        "redis://172.29.3.245:6378","redis://172.29.3.245:6379", "redis://172.29.3.245:6380")        .setPassword("a123456").setScanInterval(5000);

总结

普通分布式实现非常简单,无论是那种架构,向Redis通过EVAL命令执行lua脚本即可。

Redlock分布式锁

那么Redlock分布式锁如何实现呢?以单机模式Redis架构为例,直接看实现代码:

Config config1 = new Config();config1.useSingleServer().setAddress("redis://172.29.1.180:5378")        .setPassword("a123456").setDatabase(0);RedissonClient redissonClient1 = Redisson.create(config1);Config config2 = new Config();config2.useSingleServer().setAddress("redis://172.29.1.180:5379")        .setPassword("a123456").setDatabase(0);RedissonClient redissonClient2 = Redisson.create(config2);Config config3 = new Config();config3.useSingleServer().setAddress("redis://172.29.1.180:5380")        .setPassword("a123456").setDatabase(0);RedissonClient redissonClient3 = Redisson.create(config3);String resourceName = "REDLOCK";RLock lock1 = redissonClient1.getLock(resourceName);RLock lock2 = redissonClient2.getLock(resourceName);RLock lock3 = redissonClient3.getLock(resourceName);RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);boolean isLock;try {    isLock = redLock.tryLock(500, 30000, TimeUnit.MILLISECONDS);    System.out.println("isLock = "+isLock);    if (isLock) {        //TODO if get lock success, do something;        Thread.sleep(30000);    }} catch (Exception e) {} finally {    // 无论如何, 最后都要解锁    System.out.println("");    redLock.unlock();}

最核心的变化就是RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);,因为我这里是以三个节点为例。

那么如果是哨兵模式呢?需要搭建3个,或者5个sentinel模式集群(具体多少个,取决于你)。
那么如果是集群模式呢?需要搭建3个,或者5个cluster模式集群(具体多少个,取决于你)。

实现原理

既然核心变化是使用了RedissonRedLock,那么我们看一下它的源码有什么不同。这个类是RedissonMultiLock的子类,所以调用tryLock方法时,事实上调用了RedissonMultiLock的tryLock方法,精简源码如下:

public boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException {    // 实现要点之允许加锁失败节点限制    int failedLocksLimit = failedLocksLimit();    List<RLock> acquiredLocks = new ArrayList<RLock>(locks.size());    // 实现要点之遍历所有节点通过EVAL命令执行lua加锁    for (ListIterator<RLock> iterator = locks.listIterator(); iterator.hasNext();) {        RLock lock = iterator.next();        boolean lockAcquired;        try {            // 对节点尝试加锁            lockAcquired = lock.tryLock(awaitTime, newLeaseTime, TimeUnit.MILLISECONDS);        } catch (RedisConnectionClosedException|RedisResponseTimeoutException e) {            // 如果抛出这类异常,为了防止加锁成功,但是响应失败,需要解锁            unlockInner(Arrays.asList(lock));            lockAcquired = false;        } catch (Exception e) {            // 抛出异常表示获取锁失败            lockAcquired = false;        }                if (lockAcquired) {            // 成功获取锁集合            acquiredLocks.add(lock);        } else {            // 如果达到了允许加锁失败节点限制,那么break,即此次Redlock加锁失败            if (locks.size() - acquiredLocks.size() == failedLocksLimit()) {                break;            }                       }    }    return true;}

很明显,这段源码就是上一篇文章《Redlock:Redis分布式锁最牛逼的实现》提到的Redlock算法的完全实现。

以sentinel模式架构为例,如下图所示,有sentinel-1,sentinel-2,sentinel-3总计3个sentinel模式集群,如果要获取分布式锁,那么需要向这3个sentinel集群通过EVAL命令执行LUA脚本,需要3/2+1=2,即至少2个sentinel集群响应成功,才算成功的以Redlock算法获取到分布式锁:

Redisson中怎么实现Redis分布式锁

问题合集

Redisson中怎么实现Redis分布式锁

根据上面实现原理的分析,这位同学应该是对Redlock算法实现有一点点误解,假设我们用5个节点实现Redlock算法的分布式锁。那么要么是5个redis单实例,要么是5个sentinel集群,要么是5个cluster集群。而不是一个有5个主节点的cluster集群,然后向每个节点通过EVAL命令执行LUA脚本尝试获取分布式锁,如上图所示。

失效时间如何设置
这个问题的场景是,假设设置失效时间10秒,如果由于某些原因导致10秒还没执行完任务,这时候锁自动失效,导致其他线程也会拿到分布式锁。

这确实是Redis分布式最大的问题,不管是普通分布式锁,还是Redlock算法分布式锁,都没有解决这个问题。也有一些文章提出了对失效时间续租,即延长失效时间,很明显这又提升了分布式锁的复杂度。另外就笔者了解,没有现成的框架有实现,如果有哪位知道,可以告诉我,万分感谢。

redis分布式锁的高可用
关于Redis分布式锁的安全性问题,在分布式系统专家Martin Kleppmann和Redis的作者antirez之间已经发生过一场争论。有兴趣的同学,搜索"基于Redis的分布式锁到底安全吗"就能得到你想要的答案,需要注意的是,有上下两篇(这应该就是传说中的神仙打架吧,哈)。

zookeeper or redis
没有绝对的好坏,只有更适合自己的业务。就性能而言,redis很明显优于ZooKeeper;就分布式锁实现的健壮性而言,zookeeper很明显优于redis。如何选择,取决于你的业务!

关于Redisson中怎么实现Redis分布式锁问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: Redisson中怎么实现Redis分布式锁

本文链接: https://www.lsjlt.com/news/299755.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redisson中怎么实现Redis分布式锁
    Redisson中怎么实现Redis分布式锁,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Redis几种架构Redis发展到现在,几种常见的部署架构有:单机模式;主从模式;...
    99+
    2023-06-20
  • Redisson实现Redis分布式锁的几种方式
    目录Redis几种架构 普通分布式锁 单机模式 哨兵模式 集群模式 总结 Redlock分布式锁 实现原理 问题合集 前几天发的一篇文章《Redlock:Redis分布式锁最牛逼的实...
    99+
    2024-04-02
  • Redisson分布式锁
    文章目录 一、Redisson简单介绍二、Redisson简单使用1. maven引用2. RedisConfig配置3. StockRedissonService4. 测试 三、Redisson源码1. 加锁2. 解锁3. 自...
    99+
    2023-08-19
    分布式 redis java 缓存
  • 基于Redis分布式锁Redisson及SpringBoot集成Redisson
    目录- 分布式锁需要具备的条件和刚需- Redisson使用- SpringBoot集成Redisson- 分布式锁需要具备的条件和刚需 独占性:OnlyOne,任何时刻只能有且仅有...
    99+
    2024-04-02
  • Redis中怎么实现分布式锁
    本篇内容介绍了“Redis中怎么实现分布式锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么需要分布式...
    99+
    2024-04-02
  • SpringBoot整合Redisson实现分布式锁
    目录一、添加依赖二、redis配置文件三、新建配置类四、使用分布式锁可重入锁读写锁信号量(Semaphore)闭锁(CountDownLatch)Redisson是架设在redis基...
    99+
    2024-04-02
  • Java-Redis-Redisson分布式锁的功能使用及实现
    目录前置基础设施功能使用和介绍其他悲观锁的实现方式前置 Java-Redis-Redisson配置基础上我们进行了改造,让锁的使用更加方便 基础设施 RedissonLock imp...
    99+
    2022-11-13
    Java Redis Redisson分布式锁 Java  Redisson分布式锁
  • Redisson如何实现分布式锁、锁续约
    这篇文章主要介绍了Redisson如何实现分布式锁、锁续约的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redisson如何实现分布式锁、锁续约文章都会有所收获,下面我们一起来看看吧。一、基础0)Redisso...
    99+
    2023-07-05
  • Redis怎么实现分布式锁
    这篇文章主要介绍“Redis怎么实现分布式锁”,在日常操作中,相信很多人在Redis怎么实现分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis怎么实现分布式锁”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-02
  • Redis分布式锁怎么实现
    这篇文章给大家分享的是有关Redis分布式锁怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。分布式锁一般有三种实现方式:1、数据库乐观锁;2、基于Redis的分布式锁;3、...
    99+
    2024-04-02
  • 详解redis分布式锁(优化redis分布式锁的过程及Redisson使用)
    目录1. redis在实际的应用中2.如何使用redis的功能进行实现分布式锁2.1 redis分布式锁思想2.1.1设计思想:2.1.2 根据上面的设计思想进行代码实现2.2 使用...
    99+
    2024-04-02
  • Redisson实现分布式锁、锁续约的案例
    目录一、基础0)Redisson版本说明、案例1)Redisson连接Redis的方式2)用到的Redis命令3)用到的Lua脚本语义二、源码分析1、RLock2、加锁流程3、释放锁流程一、基础 0)Redisson版本...
    99+
    2023-03-07
    redisson分布式锁 锁续约 redisson分布式锁 redisson锁续约
  • Redis——》实现分布式锁
    推荐链接:     总结——》【Java】     总结——》【Mysql】     总结——》【Redis】     总结——》【Kafka】     总结——》【Spring】     总结—...
    99+
    2023-09-03
    redis 分布式 过期 lua
  • Redis怎么样实现分布式锁
    这篇文章主要介绍了Redis怎么样实现分布式锁,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在一个分布式系统中,会遇到一些需要对多个节点共享的资源加锁的情况,这个时候需要用到...
    99+
    2023-06-21
  • 怎么用Redis实现分布式锁
    本文小编为大家详细介绍“怎么用Redis实现分布式锁”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用Redis实现分布式锁”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单机...
    99+
    2024-04-02
  • spring redis分布式锁怎么实现
    在Spring中实现Redis分布式锁可以使用RedisTemplate来操作Redis进行加锁和解锁。 首先,我们需要定义一个分布...
    99+
    2023-10-27
    spring redis
  • 分布式锁的原理及Redis怎么实现分布式锁
    这篇文章主要介绍“分布式锁的原理及Redis怎么实现分布式锁”,在日常操作中,相信很多人在分布式锁的原理及Redis怎么实现分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2023-02-02
    redis
  • Redis实现分布式锁
    单体锁存在的问题 在单体应用中,如果我们对共享数据不进行加锁操作,多线程操作共享数据时会出现数据一致性问题。 (下述实例是一个简单的下单问题:从redis中获取库存,检查库存是否够,>0才允许下单) 我们的解决办法通常是加锁。如下加单体锁...
    99+
    2023-08-16
    分布式 java jvm
  • redis和zookeeper中怎么实现分布式锁
    redis和zookeeper中怎么实现分布式锁,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。   一、基于redis的分布...
    99+
    2024-04-02
  • SpringBoot怎么整合分布式锁redisson
    这篇文章主要介绍“SpringBoot怎么整合分布式锁redisson”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot怎么整合分布式锁redisson”文章能帮助大家解决问题。1、...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作