首页 > 数据库 >Redission红锁

Redission红锁

时间:2025-01-02 08:59:27浏览次数:3  
标签:redisson 红锁 实例 Redis 获取 Redission 客户端

目录

一、什么是红锁

二、Redission红锁的使用


 

一、什么是红锁

Redis 的作者 Salvatore Sanfilippo(又名 antirez)提出的一种基于多个 Redis 实例实现分布式锁的算法。红锁(Redlock)旨在解决单点故障问题,即当使用单个 Redis 实例作为锁服务时,如果该实例发生故障,则所有依赖于它的锁都将失效。红锁通过在多个独立的 Redis 实例上创建锁来增加系统的可用性。

红锁的工作原理大致如下:

  1. 客户端获取当前时间(以毫秒为单位)。

  2. 客户端尝试在每个 Redis 实例上获取锁,使用相同的 key 和 value(value 通常是唯一标识客户端的随机字符串),以及相同的超时时间(这个超时时间应该小于锁的有效期,以确保在网络分区的情况下,客户端不会无限期持有锁)。

  3. 客户端计算获取锁所花费的时间。如果客户端成功从大多数(N/2 + 1,其中 N 是 Redis 实例的数量)Redis 实例中获取到了锁,并且整个过程耗时小于锁的有效期减去超时时间,那么就认为客户端成功获取了红锁。

  4. 如果客户端未能成功获取大多数 Redis 实例上的锁,或者整个过程耗时超过了锁的有效期减去超时时间,那么客户端应当尝试释放所有已经成功获取的锁,以此保证其他客户端可以有机会获取到锁。

  5. 锁的有效期应该是客户端请求锁时设置的时间减去步骤3中的耗时。这确保了即使网络延迟导致客户端获取锁的时间较长,锁也不会过早地被其他客户端获取。

需要注意的是,虽然红锁算法旨在提高分布式锁的可靠性和可用性,但它的正确实现和使用需要谨慎考虑各种边界条件和潜在问题。例如,在某些极端情况下(如网络分区或时钟偏差),红锁可能无法完全避免竞态条件。因此,在实际应用中,开发者应该根据具体需求评估是否使用红锁以及如何正确配置和使用它。

二、Redission红锁的使用

Redisson 提供了对红锁(Redlock)的实现,使得开发者可以在分布式系统中轻松地使用这种高级锁机制。下面是一个使用 Redisson 实现红锁的详细例子。

  • 添加依赖

首先,你需要在项目中添加 Redisson 的依赖。如果你使用的是 Maven 构建工具,那么可以在 pom.xml 文件中添加如下依赖:

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.20.0</version> <!-- 请根据实际情况选择最新版本 -->
</dependency>
  • 配置 Redisson Client

接下来,需要配置 Redisson 客户端。为了实现红锁,通常会连接到多个独立的 Redis 实例。这里我们假设你已经有了多个 Redis 实例的地址。你可以通过 Redisson 的配置文件或者直接在代码中进行配置。以下是一个基于多个 Redis 实例的配置示例:

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

public class RedissionRedLockExample {

    private static final String[] REDIS_ADDRESSES = {
        "redis://127.0.0.1:7000",
        "redis://127.0.0.1:7001",
        "redis://127.0.0.1:7002"
    };

    public static void main(String[] args) {
        Config config = new Config();
        for (String address : REDIS_ADDRESSES) {
            config.useClusterServers()
                  .addNodeAddress(address);
        }

        RedissonClient redisson = Redisson.create(config);

        // 使用完 Redisson 后记得关闭它
        Runtime.getRuntime().addShutdownHook(new Thread(redisson::shutdown));
        
        // 下面是获取和使用红锁的例子
        tryGetRedLock(redisson);
    }

    private static void tryGetRedLock(RedissonClient redisson) {
        // 创建一个红锁对象
        RLock lock = redisson.getLock("myDistributedLock");

        try {
            // 尝试获取锁,最多等待1000毫秒,锁自动释放时间为10000毫秒
            boolean isLocked = lock.tryLock(1000, 10000, TimeUnit.MILLISECONDS);
            if (isLocked) {
                try {
                    // 在这里执行需要加锁保护的代码逻辑
                    System.out.println("成功获取锁,执行受保护的代码...");
                } finally {
                    // 确保在任何情况下都能释放锁
                    lock.unlock();
                    System.out.println("锁已释放");
                }
            } else {
                System.out.println("未能获取锁");
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            System.out.println("获取锁的过程中被中断");
        }
    }
}
  • 运行程序

确保你的 Redis 集群已经启动并且可以从你的应用程序访问。然后运行上述代码。如果一切正常,你应该可以看到程序尝试获取锁,并在成功后执行受保护的代码段,最后释放锁。

  • 注意事项

    • 确保所有参与红锁的 Redis 实例都是独立的,以避免单点故障。

    • 锁的持有时间应当设置合理,既不能太短以至于业务逻辑无法完成,也不能太长以免影响系统的并发性能。

    • 在实际应用中,应该处理好各种异常情况,例如网络分区、时钟偏差等,确保系统的健壮性。

    • 如果你在高并发环境下使用红锁,建议仔细测试并优化,以保证系统的稳定性和性能。

 

标签:redisson,红锁,实例,Redis,获取,Redission,客户端
From: https://blog.csdn.net/Lin_Miao_09/article/details/144755827

相关文章

  • Redis 分布式锁的正确实现原理演化历程与 Redission的源码
    ......
  • Redission源码浅析一:RedissonLock.lock与RedissonLock.tryLock
    RedissonLock.lock入口流程图源码分析redisssionLock.lock(longleaseTime,TimeUnitunit,booleaninterruptibly)privatevoidlock(longleaseTime,TimeUnitunit,booleaninterruptibly)throwsInterruptedException{//获取当前线程的IDlongthr......
  • java Redission 分布式锁的使用
    在微服务的场景下,一个应用会部署多个实例,在一些业务场景中,需要保证同一时间多个线程只能有一个线程操作资源,分布式锁可以实现这一需求。JAVA中,Redission分布式锁是基于Redis实现的分布式锁,使用简单,只需要关注业务场景和使用到的接口即可。引入依赖<!--https://mvnreposito......
  • 一篇文章看懂Redission原理
    文章目录☃️可重入锁原理☃️锁重试和WatchDog机制☃️MutiLock原理上一篇文章讲解了Rediision的使用,这篇文章讲解其原理☃️可重入锁原理在Lock锁中,他是借助于底层的一个voaltile的一个state变量来记录重入的状态的,比如当前没有人持有这把锁,那么state=0,假如有人......
  • Redission分布式锁介绍和配置引入
        本人在实际项目用于确保Key一致性经常使用的一种加锁方式,帮助分布式环境中互斥访问。很多人问不用锁不是一样完成目标吗?但需要清楚的是这是在高并发的场景下,多节点同时访问缓存的场景,是一般单体项目所无法比拟的,使用锁方式可以控制并发访问,避免缓存击穿和雪崩等问......
  • Redis 红锁:分布式锁的强大实现
    在分布式系统中,多个进程或线程可能需要并发访问共享资源。为了确保数据的一致性和正确性,我们需要一种分布式锁机制来协调这些访问。Redis红锁就是这样一种强大的分布式锁实现。一、分布式锁的概念分布式锁是一种用于在分布式系统中实现资源互斥访问的机制。它的目的是确......
  • 分布式锁中的王者方案 - Redission
    文章目录5.1分布式锁-redission功能介绍5.2分布式锁-Redission快速入门5.3分布式锁-redission可重入锁原理5.4分布式锁-redission锁重试和WatchDog机制5.5分布式锁-redission锁的MutiLock原理5.1分布式锁-redission功能介绍基于setnx实现的分布式锁存在......
  • 面试官:说一下红锁RedLock的实现原理?
    RedLock是一种分布式锁的实现算法,由Redis的作者SalvatoreSanfilippo(也称为Antirez)提出,主要用于解决在分布式系统中实现可靠锁的问题。在Redis单独节点的基础上,RedLock使用了多个独立的Redis实例(通常建议是奇数个,比如5个),共同协作来提供更强健的分布式锁服务。RedLo......
  • 东方红锁车版本死机问题分析
    现象:与东方红ecu交互过程中,程序进入hardfault异常;查找过程:方式1、通过keil软件调试功能,在hardfault处打断点,查看callstack窗口。callstack窗口处,有函数调用过程,但全是freertos系统函数调用,没有自己定义的函数,系统函数是没问题的,故想通过查看callstack窗口查找问题行不通了;方......
  • SpringBoot系列之集成Redission入门与实践教程
    Redisson是一款基于java开发的开源项目,提供了很多企业级实践,比如分布式锁、消息队列、异步执行等功能。本文基于Springboot2版本集成redisson-spring-boot-starter实现redisson的基本应用软件环境:JDK1.8SpringBoot2.2.1Maven3.2+Mysql8.0.26redisson-spring-boot-starter3.15.......