首页 > 数据库 >Redisson

Redisson

时间:2025-01-20 18:57:19浏览次数:3  
标签:Redisson lock Redis 线程 tryLock 分布式

Redisson 是一个基于 Redis 的 Java 客户端,提供了丰富的 分布式功能,并且对 Redis 的操作进行了封装,使得开发者可以更方便地使用 Redis 作为分布式缓存、消息队列、分布式锁等功能的实现工具。

Redisson 是一个功能强大的开源框架,能够通过 Redis 实现许多分布式系统常用的特性,它不仅仅是一个 Redis 客户端,还提供了大量高层次的 API,支持在 Java 应用中方便地实现分布式架构。

主要特性:

  1. 分布式锁(Distributed Lock)
    • Redisson 提供了分布式锁的功能,使得多个应用实例可以协调资源访问,防止出现并发冲突。
    • 它提供了基于 Redis 实现的互斥锁、读写锁等功能,适用于分布式环境中的同步控制。
  2. 分布式集合(Distributed Collections)
    • 支持分布式集合(如 List, Set, Map, Queue 等),使得在多个 Redis 节点之间共享数据结构变得简单。
    • 比如,RMap 作为分布式 HashMap,RQueue 作为分布式队列等。
  3. 分布式缓存(Distributed Cache)
    • 使用 Redis 作为分布式缓存解决方案,Redisson 可以让你的 Java 应用非常容易地与 Redis 进行缓存操作。
  4. 分布式计数器(Distributed Counters)
    • Redisson 提供了基于 Redis 的分布式计数器、AtomicLong 和 AtomicReference 实现,支持高效的分布式计数和状态管理。
  5. 分布式消息队列(Distributed Message Queue)
    • Redisson 支持通过 Redis 实现分布式消息队列,它可以帮助系统实现异步消息处理和任务调度。
    • 支持发布/订阅模式以及消息消费者的自动扩展。
  6. 分布式执行(Distributed Executor Service)
    • Redisson 提供了分布式的执行框架,类似 Java 的 ExecutorService,但它允许在多个节点间分配和执行任务。
  7. 分布式对象(Distributed Objects)
    • Redisson 提供了对分布式对象的支持,如 RMap, RSet, RList, RQueue,可以在不同的 Redis 实例间共享数据。
  8. Redis 集群支持
    • Redisson 对 Redis 集群提供了全面的支持,允许应用程序在 Redis 集群环境中运行而无需显式处理集群相关的复杂性。
  9. 分布式锁支持(例如 Redisson 提供的分布式锁)
    • Redisson 提供了强大的分布式锁支持,适用于需要控制访问资源的场景,比如数据库或文件系统中的资源。

Redisson 的优势:

  • 简化的 API:Redisson 提供了一些高层次的 API,简化了 Redis 的操作。开发者不需要关心 Redis 命令的细节,可以专注于业务逻辑的实现。
  • 高效的分布式支持:Redisson 能够方便地在分布式环境中实现高效的数据存取和同步控制。
  • 线程安全:Redisson 对 Redis 数据结构的封装是线程安全的,可以在多个线程和多个 Redis 实例之间共享数据。
  • 与 Java 集合兼容:Redisson 提供的分布式集合 API 与 Java 集合的 API 接口类似,使得开发者可以很容易地迁移到分布式系统。

使用场景:

  1. 分布式缓存:通过 Redis 实现高效的分布式缓存系统,减少数据库访问压力。
  2. 分布式锁:用于在多个进程或节点之间协调资源访问,防止资源冲突。
  3. 分布式队列:通过 Redis 实现异步任务处理和消息传递系统。
  4. 分布式计数器:在多个实例之间共享状态,比如页面访问计数、全局唯一 ID 生成等。
  5. 分布式集合:在多个服务之间共享数据,比如分布式共享的 List、Map 等。

示例:如何使用 Redisson

java复制代码import org.redisson.api.*;

public class RedissonExample {

    public static void main(String[] args) {
        // 创建Redisson客户端配置
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");

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

        // 获取分布式锁
        RLock lock = redisson.getLock("myLock");

        // 使用分布式锁
        try {
            lock.lock();
            System.out.println("Lock acquired, performing task...");

            // 执行一些任务
            Thread.sleep(1000);

        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
            System.out.println("Lock released.");
        }

        // 获取分布式Map
        RMap<String, String> map = redisson.getMap("myMap");
        map.put("key", "value");

        // 关闭Redisson客户端
        redisson.shutdown();
    }
}

Redisson 是一个功能强大的 Redis 客户端,它为 Java 应用程序提供了丰富的分布式数据结构和工具,使得在分布式环境中使用 Redis 更加方便和高效。它封装了许多常用的分布式功能,如分布式锁、分布式队列、分布式计数器等,非常适合需要高可用性和分布式协调的系统。

Redisson 中,RLock 是一个分布式锁的接口,用于在分布式系统中确保对共享资源的独占访问。RLock 提供了两种常见的锁操作方法:lock()tryLock()。它们的工作方式略有不同,适用于不同的场景。下面是对这两种方法的详细解释。

1. lock() 方法

lock() 是一个 阻塞型锁。当你调用 lock() 方法时,如果锁已经被其他线程或进程占用,当前线程将被阻塞,直到锁被释放为止。也就是说,调用 lock() 方法的线程会一直等待,直到成功获取到锁。

使用场景:
  • 当你需要确保只有一个线程能访问共享资源时,使用 lock() 方法非常合适。它会一直等待,直到锁可用。
示例代码:
java复制代码import org.redisson.api.*;

public class RedissonLockExample {
    public static void main(String[] args) {
        // 创建Redisson客户端配置
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");

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

        // 获取分布式锁
        RLock lock = redisson.getLock("myLock");

        // 使用lock方法进行锁定
        try {
            lock.lock();  // 阻塞直到获取到锁
            System.out.println("Lock acquired, performing task...");
            // 执行一些任务
            Thread.sleep(2000);  // 模拟任务处理
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();  // 释放锁
            System.out.println("Lock released.");
        }

        // 关闭Redisson客户端
        redisson.shutdown();
    }
}
lock() 方法的特性:
  • 阻塞:如果锁已经被占用,当前线程会一直阻塞,直到能够成功获取到锁。
  • 锁释放:调用 unlock() 后释放锁。

2. tryLock() 方法

tryLock() 方法是一个 非阻塞型锁。当你调用 tryLock() 方法时,Redisson 会立即尝试获取锁。如果锁已被其他线程占用,它不会阻塞当前线程,而是返回一个布尔值,表示是否成功获取到锁。tryLock() 方法的调用不会使线程进入等待状态。

使用场景:
  • 当你希望在获取锁的同时不阻塞当前线程时,使用 tryLock() 方法。例如,在你尝试获取锁的一定时间内,如果没有成功就放弃,避免长时间等待。
  • 它适用于你不确定锁是否可用,或者不希望当前线程在无法获得锁时被阻塞的场景。
示例代码:
java复制代码import org.redisson.api.*;

public class RedissonTryLockExample {
    public static void main(String[] args) {
        // 创建Redisson客户端配置
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");

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

        // 获取分布式锁
        RLock lock = redisson.getLock("myLock");

        // 使用tryLock方法尝试获取锁
        try {
            // 尝试获取锁,等待最多500毫秒,如果获取不到锁则返回false
            boolean locked = lock.tryLock(500, 2000, TimeUnit.MILLISECONDS);
            if (locked) {
                System.out.println("Lock acquired, performing task...");
                // 执行一些任务
                Thread.sleep(2000);  // 模拟任务处理
            } else {
                System.out.println("Unable to acquire lock.");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            // 如果锁已被获取,释放锁
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
                System.out.println("Lock released.");
            }
        }

        // 关闭Redisson客户端
        redisson.shutdown();
    }
}
tryLock() 方法的特性:
  • 非阻塞tryLock() 不会使当前线程阻塞。如果锁不可用,立即返回 false
  • 可设置超时时间:可以指定等待时间和自动释放的时间。例如,可以设置尝试获取锁的最长等待时间,超时后返回 false
  • 锁的释放:如果获取到了锁,需要显式调用 unlock() 释放锁。

tryLock() 的重载方法:

tryLock() 方法有多个重载版本,可以设置不同的超时时间和等待时间。

  • tryLock(long waitTime, long leaseTime, TimeUnit unit)

    • waitTime:最大等待时间。如果在此时间内没有获取到锁,返回 false
    • leaseTime:持有锁的最大时间,超时后自动释放锁。
    • unit:时间单位,通常是 TimeUnit.MILLISECONDSTimeUnit.SECONDS 等。
示例:设置最长等待时间和自动释放时间
java


复制代码
boolean locked = lock.tryLock(500, 1000, TimeUnit.MILLISECONDS);
  • 500 表示最多等待 500 毫秒来获取锁。
  • 1000 表示获取锁后,锁会自动释放 1000 毫秒(1秒)后。

总结

  • lock() 是一个 阻塞型 的方法,如果当前锁已被占用,调用它的线程会被阻塞直到获得锁。适用于需要确保获取锁的场景。
  • tryLock() 是一个 非阻塞型 的方法,允许你尝试获取锁,并且可以设置等待时间和超时后自动释放锁的时间。适用于不希望阻塞线程的场景。

这两种方法都适用于不同的应用场景,选择哪一种取决于你的具体需求。

标签:Redisson,lock,Redis,线程,tryLock,分布式
From: https://blog.csdn.net/weixin_47654264/article/details/145222719

相关文章

  • Springboot(五十八)SpringBoot3使用Redisson实现接口的限流功能
    这部分我记录一下我使用redission实现接口限流的全过程。关于自定义注解,请移步《SpringBoot(二十六)SpringBoot自定义注解》一:redission自定义限流注解主要流程对接口实现限流,主要使用了Redisson提供的限流API方法;使用很简单:第一步:声明一个限流器; RRateLimiter rRateLim......
  • 关于redisson的一些问题,为什么要用watchDog
    redisson获取不到锁怎么处理1.阻塞等待锁释放:redisson有waitTimeout参数控制锁等待时间,当某线程获取不到锁时,会进入阻塞状态等待锁释放或超过设置的时间2.tryLock会根据参数直接返回或者抛出异常。 tryLock一般有两种:一种是不带参数的,这种不会阻塞,锁可用就返回true,锁不可用就......
  • 分布式锁Redisson详解,Redisson如何解决不可重入,不可重试,超时释放,主从一致问题的分析解
    目录1.Redisson解决不可重入锁导致的死锁问题 2.不可重试问题Pub/Sub的优势锁释放的发布逻辑3.超时释放的问题1.锁的超时释放机制背景2.源码分析2.1锁的获取2.2看门狗机制2.3看门狗续期实现2.4手动设置锁的过期时间总结 4.主从一致性 问题背景......
  • 记 Redisson 报错 attempt to unlock lock, not locked by current thread
    原文:记一次Redisson线上问题→你怎么能释放别人的锁错误信息:attempttounlocklock,notlockedbycurrentthreadbynodeid:b9df1975-5595-42eb-beae-bdc5d67bce49thread-id:52查看日志,找到对应的堆栈信息:Exceptioninthread"thread0"java.lang.IllegalMoni......
  • Redisson看门狗机制你了解多少
    前言谈到Redisson就不得不说Redis了,一想到Redis就不得不想到并发编程锁机制,一想到锁机制那么就不能不考虑一个很头疼的问题,如何保证原子性的问题,高QPS请求量的系统对每次执行数据的原子性由为的关键,保证不了原子性就会导致一系列重复提交的操作,重复的数据导致在某些逻辑运算的......
  • 《深入剖析Redisson源码》揭秘Redisson分布式锁原理(可重入锁机制、PubSub可重试机制、
    Hiヽ(゜▽゜)-欢迎来到蓝染Aizen的CSDN博客~......
  • Springboot(五十三)SpringBoot3整合redisson
    前边我们有记录Springboot2/3整合redis的方式。是基于Springboot默认集成的Lettuce客户端实现的。今天我们在项目中集成的redission是在Lettuce之上构建的redis客户端。Redisson:一个在Jedis和Lettuce之上构建的Redis客户端。提供了一系列分布式Java对象和服务,比如:分布式锁......
  • 带你读懂Redisson分布式锁原理
    带你读懂Redisson分布式锁原理本篇带大家详细了解Redisson分布式锁原理,通过仔细阅读源码,逐步分析获取锁和释放锁的具体流程,并且为大家讲解每一步的执行过程,结尾会附有整个过程的流程图文章目录带你读懂Redisson分布式锁原理重试原理`tryLock`方法:`tryLock`重载方法:`......
  • 使用Redisson分布式锁实现幂等性处理
            物理网中往往会遇到某些设备疯狂的上报数据,而我们的服务端如果每个请求都处理,一是对服务性能要求比较高否则来不急处理,二是对我们的服务压力比较大,而且大部分上报的数据以及处理结果都是一样的。        因此,为了减少这种设备重复上报的场景对我们服......
  • Redisson分布式锁如何实现可重入
    Redisson分布式锁如何实现可重入本篇将从源码的角度去讲解Redisson分布式锁如何实现可重入的我们都知道Redisson的分布式锁比起我们自己用Redis实现的分布式锁有许多优点:可重入可重试超时续约当我们使用Redisson去获取一个分布式锁的时候,大致的代码如下:@Autowiredp......