redisson中的分布式锁二

57 阅读14分钟

本文链接: blog.csdn.net/qq_39017153…

版权

分布式锁同时被 2 个专栏收录

6 篇文章0 订阅

订阅专栏

redis

5 篇文章0 订阅

订阅专栏

公平锁(Fair Lock)

基于Redis的Redisson分布式可重入公平锁也是实现了 java.util.concurrent.locks.Lock 接口的一种 RLock 对象。同时还提供了 异步(Async)反射式(Reactive)RxJava2标准 的接口。它保证了当多个Redisson客户端线程同时请求加锁时,优先分配给先发出请求的线程。所有请求线程会在一个队列中排队,当某个线程出现宕机时,Redisson会等待5秒后继续下一个线程,也就是说如果前面有5个线程都处于等待状态,那么后面的线程会等待至少25秒。

RLock fairLock = redisson.getFairLock("anyLock");
// 最常见的使用方法
fairLock.lock();

// 10秒钟以后自动解锁
// 无需调用unlock方法手动解锁
fairLock.lock(10, TimeUnit.SECONDS);

// 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
boolean res = fairLock.tryLock(100, 10, TimeUnit.SECONDS);
fairLock.unlock();

联锁(MultiLock)

基于Redis的Redisson分布式联锁 RedissonMultiLock 对象可以将多个 RLock 对象关联为一个联锁,每个 RLock 对象实例可以来自于不同的Redisson实例。

RLock lock1 = redissonInstance1.getLock("lock1");
RLock lock2 = redissonInstance2.getLock("lock2");
RLock lock3 = redissonInstance3.getLock("lock3");

RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
// 同时加锁:lock1 lock2 lock3
// 所有的锁都上锁成功才算成功。
lock.lock();
...
lock.unlock();

红锁(RedLock)

基于Redis的Redisson红锁 RedissonRedLock 对象实现了 Redlock 介绍的加锁算法。该对象也可以用来将多个 RLock 对象关联为一个红锁,每个 RLock 对象实例可以来自于不同的Redisson实例。

RLock lock1 = redissonInstance1.getLock("lock1");
RLock lock2 = redissonInstance2.getLock("lock2");
RLock lock3 = redissonInstance3.getLock("lock3");

RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);
// 同时加锁:lock1 lock2 lock3
// 红锁在大部分节点上加锁成功就算成功。
lock.lock();
...
lock.unlock();

读写锁(ReadWriteLock)

基于Redis的Redisson分布式可重入读写锁 RReadWriteLock Java对象实现了 java.util.concurrent.locks.ReadWriteLock 接口。其中读锁和写锁都继承了 RLock 接口。

分布式可重入读写锁允许同时有多个读锁和一个写锁处于加锁状态。

RReadWriteLock rwlock = redisson.getReadWriteLock("anyRWLock");
// 最常见的使用方法
rwlock.readLock().lock();
// 或
rwlock.writeLock().lock();

// 10秒钟以后自动解锁
// 无需调用unlock方法手动解锁
rwlock.readLock().lock(10, TimeUnit.SECONDS);
// 或
rwlock.writeLock().lock(10, TimeUnit.SECONDS);

// 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
boolean res = rwlock.readLock().tryLock(100, 10, TimeUnit.SECONDS);
// 或
boolean res = rwlock.writeLock().tryLock(100, 10, TimeUnit.SECONDS);
...
lock.unlock();

添加StockController方法:

@GetMapping("test/read")
public String testRead(){
    String msg = stockService.testRead();

    return "测试读";
}

@GetMapping("test/write")
public String testWrite(){
    String msg = stockService.testWrite();

    return "测试写";
}

添加StockService方法:

public String testRead() {
    RReadWriteLock rwLock = this.redissonClient.getReadWriteLock("rwLock");
    rwLock.readLock().lock(10, TimeUnit.SECONDS);

    System.out.println("测试读锁。。。。");
    // rwLock.readLock().unlock();

    return null;
}

public String testWrite() {
    RReadWriteLock rwLock = this.redissonClient.getReadWriteLock("rwLock");
    rwLock.writeLock().lock(10, TimeUnit.SECONDS);

    System.out.println("测试写锁。。。。");
    // rwLock.writeLock().unlock();

    return null;
}

打开开两个浏览器窗口测试:

  • 同时访问写:一个写完之后,等待一会儿(约10s),另一个写开始
  • 同时访问读:不用等待
  • 先写后读:读要等待(约10s)写完成
  • 先读后写:写要等待(约10s)读完成

信号量(Semaphore)

基于Redis的Redisson的分布式信号量( Semaphore)Java对象 RSemaphore 采用了与 java.util.concurrent.Semaphore 相似的接口和用法。同时还提供了 异步(Async)反射式(Reactive)RxJava2标准 的接口。

RSemaphore semaphore = redisson.getSemaphore("semaphore");
semaphore.trySetPermits(3);
semaphore.acquire();
semaphore.release();

在StockController添加方法:

@GetMapping("test/semaphore")
public String testSemaphore(){
    this.stockService.testSemaphore();

    return "测试信号量";
}

在StockService添加方法:

public void testSemaphore() {
    RSemaphore semaphore = this.redissonClient.getSemaphore("semaphore");
    semaphore.trySetPermits(3);
    try {
        semaphore.acquire();

        TimeUnit.SECONDS.sleep(5);
        System.out.println(System.currentTimeMillis());

        semaphore.release();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

添加测试用例:并发10次,循环一次

在这里插入图片描述

控制台效果:

控制台1:
1606960790234
1606960800337
1606960800443
1606960805248

控制台2:
1606960790328
1606960795332
1606960800245

控制台3:
1606960790433
1606960795238
1606960795437

由此可知:

1606960790秒有3次请求进来:每个控制台各1次

1606960795秒有3次请求进来:控制台2有1次,控制台3有2次

1606960800秒有3次请求进来:控制台1有2次,控制台2有1次

1606960805秒有1次请求进来:控制台1有1次

闭锁(CountDownLatch)

基于Redisson的Redisson分布式闭锁( CountDownLatch)Java对象 RCountDownLatch 采用了与 java.util.concurrent.CountDownLatch 相似的接口和用法。

RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");
latch.trySetCount(1);
latch.await();

// 在其他线程或其他JVM里
RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");
latch.countDown();

需要两个方法:一个等待,一个计数countDown

给StockController添加测试方法:

@GetMapping("test/latch")
public String testLatch(){
    this.stockService.testLatch();

    return "班长锁门。。。";
}

@GetMapping("test/countdown")
public String testCountDown(){
    this.stockService.testCountDown();

    return "出来了一位同学";
}

给StockService添加测试方法:

public void testLatch() {
    RCountDownLatch latch = this.redissonClient.getCountDownLatch("latch");
    latch.trySetCount(6);

    try {
        latch.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public void testCountDown() {
    RCountDownLatch latch = this.redissonClient.getCountDownLatch("latch");
    latch.trySetCount(6);

    latch.countDown();
}

重启测试,打开两个页面:当第二个请求执行6次之后,第一个请求才会执行。

关注博主即可阅读全文

确定要放弃本次机会?

福利倒计时

: :

立减 ¥

普通VIP年卡可用

立即使用


孟德爱吃香菜

关注关注

  • 0

点赞

收藏

觉得还不错?

一键收藏

  • 知道了
    0
    评论

redisson中的分布式锁二

它保证了当多个Redisson客户端线程同时请求加锁时,优先分配给先发出请求的线程。所有请求线程会在一个队列中排队,当某个线程出现宕机时,Redisson会等待5秒后继续下一个线程,也就是说如果前面有5个线程都处于等待状态,那么后面的线程会等待至少25秒。1606960795秒有3次请求进来:控制台2有1次,控制台3有2次。1606960800秒有3次请求进来:控制台1有2次,控制台2有1次。1606960805秒有1次请求进来:控制台1有1次。基于Redis的Redisson的分布式信号量(

复制链接

扫一扫

专栏目录

参与评论您还未登录,请先登录后发表或查看评论

redisson 实现 分布式锁 原理

08-31

在本文 ,我们将深入探讨 Redisson 如何实现 分布式锁,以及其特点和机制。 分布式锁 是多节点环境下解决并发问题的关键工具,确保在 分布式 系统 同一资源在同一时刻只被一个线程访问。 Redisson 的 R Lock 接口实现了...

Redis s ion 可重入锁(Reentrant Lock)公平锁(F air Lock

qq_40250122的博客

01-14 4383

/\
\
Copyright 2021 Wicrenet, Inc. All rights reserved.
*/
package com.allianity.modules.cms.cache.impl;

import com.allianity.common.learning.enums. Redis RouteKeyEnum;
import com.allianity.modules.cms.cache.UserCoursewareCache;
import org. redisson.api.RM

Redisson 分布式锁 学习总结:公平锁 Redisson F air Lock# lock 获取锁源码分析

Howinfun的博客

11-16 2004

Redisson 分布式锁 学习总结: Redisson F air Lock# lock 源码分析

5.【 Redisson 源码】公平锁加锁流程

weixiaohuai的博客

12-30 1642

通过lindex指令获取 redisson_ lock_queue:{f air Lock}在List等待队列的第一个元素,因为此时t2、t3线程都在等待队列 ,所以会执行zscore redisson_ lock_timeout:{f air Lock} d23e0d6b-437c-472c-9c9d-2147907ab8f9:47,从zset有序集合 获取d23e0d6b-437c-472c-9c9d-2147907ab8f9:47对应的分数,也就是对应的过时时间,timeout = 1663143100976。

Redisson 分布式锁Redisson 公平锁实现机制

最新发布

qq_45260619的博客

03-05 1319

上一篇说了 可重入锁 加锁的流程,这个可重入锁其实就是非公平锁,非公平体现在哪里呢?
体现在当前客户端如果抢锁失败的话,会拿到这个锁的剩余存活时间,会进行等待,等待之后再次去尝试加锁,里边是没有任何排队的逻辑的,因此是非公平锁

redisson 实现 分布式锁

12-16

redisson 实现 分布式锁,基于aop注解形式使用。

SpringBoot集成 Redisson 实现 分布式锁 的方法示例

08-25

SpringBoot集成 Redisson 实现 分布式锁 的方法示例 分布式锁 是一种机制,用于在 分布式 系统环境 ,确保多个进程或线程在同一时间内,访问共享资源的安全性。SpringBoot集成 Redisson 是实现 分布式锁 的一种常用方法,下面...

Java redisson 实现 分布式锁 原理详解

08-24

Java Redisson 实现 分布式锁 原理详解 分布式锁 的重要性 在 分布式 系统 ,锁机制是非常重要的,它可以防止多个节点同时访问共享资源,避免数据不一致和错误。 Java Redisson 是一个流行的 分布式锁 实现,它提供了一...

Java编程 redisson 实现 分布式锁 代码示例

08-29

Redisson分布式锁 机制可以解决 分布式 系统 的并发访问问题,确保在多个节点之间的并发访问共享资源时,能够安全地访问共享资源。 可重入锁(Reentrant LockRedisson分布式 可重入锁R Lock Java对象实现了java...

Redisson 源码解读-公平锁

王谷雨的博客

11-08 574

本文介绍了 Redisson 的公平锁,逻辑大体上和普通可重入锁一致,核心在于 lua 脚本,运用了 Redis 的3种数据类型。

Redisson 分布式锁 学习总结:公平锁 Redisson F air Lock#un Lock 释放锁源码分析

Howinfun的博客

11-18 1270

Redisson 分布式锁 学习总结: Redisson F air Lock#un Lock 源码分析

最强 分布式 工具 Redisson分布式锁

xc2011的博客

10-20 2192

redis 分布式锁 Redisson

Redisson 分布式锁 源码 05:公平锁加锁

程序员小航

07-07 645

前言
默认的加锁逻辑是非公平的。
在加锁失败时,线程会进入 while 循环,一直尝试获得锁,这时候是多线程进行竞争。就是说谁抢到就是谁的。
Redisson 提供了 公平锁 机制,使用方式如下:
R Lock f air Lock = redisson.getF air Lock("any Lock");
// 最常见的使用方法
f air Lock. lock();

下面一起看下公平锁是如何实现的?
公平锁
相信小伙伴们看过前面的文章,已经轻车熟路了,直接定位到源码方法: Redisson F air Lock#try Lock

Redisson 源码学习之 Redisson F air Lock

weixin_30437481的博客

12-23 178

博客待整理,先只是把源码看了....
后面不再备注 redis 的命令含义了,这样备注写太多了不好阅读.
package org. redisson;

import java.util.Arrays;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent. lock s.Condi...

Java之—— redis 并发读写锁,使用 Redisson 实现 分布式锁

热门推荐

冰河的专栏

06-21 4万+

最近由于工作很忙,很长时间没有更新博客了,今天为大家带来一篇有关 Redisson 实现 分布式锁 的文章,好了,不多说了,直接进入主题。
1. 可重入锁(Reentrant Lock
Redisson分布式 可重入锁R Lock Java对象实现了java.util.concurrent. lock s. Lock 接口,同时还支持自动过期解锁。

public void testReentrantLo

使用 Redisson 实现 分布式锁

weixin_34007886的博客

02-05 356

为什么80%的码农都做不了架构师?>>>

...

redisson- 分布式锁 与同步器学习

qq523786283的博客

06-11 2566

简单使用

基本

// 1. 创建配置对象
Config = ...

// 2. 创建 redisson 实例
Redisson Client redisson = Redisson.create(config);

// 3. 获得锁对象
R Lock lock = redisson.get Lock("my Lock");

// 4. 上锁
lock. lock();

// 做你想做的。。。...

redisson 分布式锁 的实现

ningshuaichen的专栏

11-13 851

最近由于工作很忙,很长时间没有更新博客了,今天为大家带来一篇有关 Redisson 实现 分布式锁 的文章,好了,不多说了,直接进入主题。

1. 可重入锁(Reentrant Lock

Redisson分布式 可重入锁R Lock Java对象实现了java.util.concurrent. lock s. Lock 接口,同时还支持自动过期解锁。
[java] view

redisson 哨兵 分布式锁

09-09

Redisson 哨兵 分布式锁 是一种使用 Redisson 框架实现的 分布式锁。在 分布式 高并发的条件下,如果一个线程获取了锁,但由于系统故障或其他原因无法及时释放锁,就可能导致其他线程无法获取锁,从而产生死锁的情况。因此,...

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

孟德爱吃香菜CSDN认证博客专家CSDN认证企业博客

码龄7年
暂无认证

119原创6065周排名1万+总排名14万+访问等级

1941积分5092粉丝613获赞51评论633收藏

习惯养成

新秀勋章

博客之星–参与

持之以恒

勤写标兵

笔耕不辍

话题达人

创作能手

知无不言

私信

关注

写文章

热门文章

分类专栏

最新评论

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

2024年24篇

2023年96篇

目录

目录

分类专栏

目录

评论

被折叠的  条评论 为什么被折叠? 到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元 前往充值 >

需支付:10.00元

取消确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝 规则

hope_wisdom

发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。

2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值