首页 > 数据库 >RedissonRedLock写一个加锁方式,实现自动延时、程序停止就停止延时

RedissonRedLock写一个加锁方式,实现自动延时、程序停止就停止延时

时间:2024-02-07 21:32:13浏览次数:33  
标签:加锁 lock RLock locks 停止 延时 static 续期 Config

要使用 Redisson 的 RedLock 实现加锁,并实现自动延时以及在程序停止时停止延时,你可以按照以下示例代码进行操作:

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

import java.util.concurrent.TimeUnit;

public class RedissonRedLockWithAutoRenewal {

    private static final long LEASE_TIME = 30 * 1000L; // 锁的过期时间,默认为 30 秒
    private static final long RENEWAL_INTERVAL = 10 * 1000L; // 自动续期的时间间隔,默认为 10 秒

    public static void main(String[] args) {
        Config config1 = new Config();
        config1.useSingleServer().setAddress("redis://127.0.0.1:6379");

        Config config2 = new Config();
        config2.useSingleServer().setAddress("redis://127.0.0.1:6380");

        Config config3 = new Config();
        config3.useSingleServer().setAddress("redis://127.0.0.1:6381");

        RedissonClient redissonClient1 = Redisson.create(config1);
        RedissonClient redissonClient2 = Redisson.create(config2);
        RedissonClient redissonClient3 = Redisson.create(config3);

        RLock lock1 = redissonClient1.getLock("lock:key");
        RLock lock2 = redissonClient2.getLock("lock:key");
        RLock lock3 = redissonClient3.getLock("lock:key");

        RLock[] locks = new RLock[]{lock1, lock2, lock3};

        // 获取锁并执行任务
        try {
            if (tryLock(locks)) {
                // 执行具体的业务逻辑

                // 启动自动续期任务
                startRenewalTask(locks);
            } else {
                // 获取锁失败,处理锁被其他程序占用的逻辑
            }
        } catch (InterruptedException e) {
            // 处理中断异常
        } finally {
            // 停止自动续期任务
            stopRenewalTask(locks);

            // 释放锁
            for (RLock lock : locks) {
                if (lock.isHeldByCurrentThread()) {
                    lock.unlock();
                }
            }

            // 关闭 Redis 客户端
            redissonClient1.shutdown();
            redissonClient2.shutdown();
            redissonClient3.shutdown();
        }
    }

    private static boolean tryLock(RLock[] locks) throws InterruptedException {
        return RedissonRedLock.tryLock(locks, LEASE_TIME, TimeUnit.MILLISECONDS);
    }

    private static void startRenewalTask(RLock[] locks) {
        Thread renewalThread = new Thread(() -> {
            while (true) {
                try {
                    // 等待续期时间间隔
                    Thread.sleep(RENEWAL_INTERVAL);

                    // 续期
                    for (RLock lock : locks) {
                        lock.expire(LEASE_TIME, TimeUnit.MILLISECONDS);
                    }
                } catch (InterruptedException e) {
                    break;
                }
            }
        });
        renewalThread.setDaemon(true);
        renewalThread.start();
    }

    private static void stopRenewalTask(RLock[] locks) {
        for (RLock lock : locks) {
            lock.expire(0, TimeUnit.MILLISECONDS); // 立即释放锁
        }
    }
}

在这个示例中,我们使用了 Redisson 的 RedLock 实现,创建了三个 Redis 客户端和三个分布式锁对象。我们通过调用 RedissonRedLock.tryLock(locks, LEASE_TIME, TimeUnit.MILLISECONDS) 方法尝试获取分布式锁,如果成功获取到锁,则可以执行具体的业务逻辑。在获取到锁后,我们启动一个线程来定时进行续期操作,并在程序停止时停止续期任务。

当程序运行结束时,我们释放所有的锁,并关闭 Redis 客户端连接。

希望这个示例能够满足你的需求!

标签:加锁,lock,RLock,locks,停止,延时,static,续期,Config
From: https://blog.51cto.com/u_16007699/9640558

相关文章

  • nginx默认的启动停止重启命令是什么?
    在Linux系统中,Nginx服务的启动、停止和重启命令通常如下:启动Nginx:对于基于systemd的系统(如Ubuntu15.04+、CentOS7+):sudosystemctlstartnginx对于不使用systemd管理的传统init系统(如Ubuntu14.04及以前版本):sudoservicenginxstart或者直接执行nginx可执行文件(如......
  • linux的java服务启动,停止sh脚本
    #!/bin/bash#######################################################Copyright2019PhamNgocHoai##LicensedundertheApacheLicense,Version2.0(the"License");#youmaynotusethisfileexceptincompliancewiththeLicense.#Youmay......
  • IIS网站定时停止和启动
     一,创建2个批处理文件iisstart.bat@echooffnetstartiisadminnetstartw3svc iisstop.bat@echoofftaskkill/f/imw3wp.exeiisreset/STOPtaskkill/f/imw3wp.exe 二,通过windows自带“任务计划程序”定时执行批处理命令 下面注意权限 为“使用最......
  • Linux中国开源社区停止运营
    layout:posttitle:"Linux中国开源社区停止运营"tags:-"Linux"昨天看到老王发的公众号文章,Linux中国开源社区停止运营了。关注到「硬核老王」是近几年的事,也经常看一些Linux中国公众号上的文章以及视频号视频。去年在深度开源之夜有幸与老王有过一面之缘。看到消息感觉......
  • STM32CubeMX教程25 PWR 电源管理 - 睡眠、停止和待机模式
    1、准备材料开发板(正点原子stm32f407探索者开发板V2.4)STM32CubeMX软件(Version6.10.0)野火DAP仿真器keilµVision5IDE(MDK-Arm)ST-LINK/V2驱动XCOMV2.6串口助手2、实验目标使用STM32CubeMX软件配置STM32F407开发板的PWR电源管理,并了解STM32的睡眠、停止和待机模式3、实验......
  • 如何解决MySQL主从复制延时问题
    MySQL主从复制是面试中不可避开的重要一环,里面的知识点虽然基础,但是能回答全的同学不多,今天我们再来老生常谈一下。本文全文内容如下。  1.MySQL主从1.1什么是MySQL主从?MySQL主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL......
  • java使用redis 加锁
    配置类:publicclassRedisLockUtil{privatestaticRedisCacheredisCache=null;/***给key加锁,如果加锁成功,则返回true,加锁失败返回false*@return*/publicstaticbooleanlock(Stringkey,Integertimeout,TimeUnittimeUnit){......
  • 软件测试停止标准
    ......
  • 中断机制之通过interrupt实现线程中断停止
    如何停止中断运行中的线程?首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了interrupt实现线程中断停止用isInterrupted判断当前线程是否被中断,用interrupt()设置线......
  • 中断机制之通过AtomicBoolean实现线程中断停止
    如何停止中断运行中的线程?首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了AtomicBoolean实现线程中断演示通过修改共享变量的方式来达到通知的目的从而使目的线程......