欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

分布式锁Redisson的使用,看门狗机制

程序员文章站 2022-09-02 17:33:46
分布式锁Redisson的使用,看门狗机制Redisson简介Redisson使用项目使用以及说明Redisson简介Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore...

分布式锁Redisson的使用,看门狗机制

Redisson简介

Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。

Redisson使用

1.引入依赖

<dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.12.0</version>
</dependency>

2.编写配置类,初始化一个RedissonClient对象

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

/**
 * @ClassName MyRedissonConfig.java
 * @Author 拾光
 * @Date 2020年07月25日 18:14:00
 * @Description redisson配置类
 */
@Configuration
public class MyRedissonConfig {
    /**
     * 所有对redisson的使用都是通过RedissonClient来使用
     * @return
     * @throws IOException
     */
    @Bean(destroyMethod="shutdown")
   public RedissonClient redisson() throws IOException {
        //1 创建配置
        Config config = new Config();
        config.useSingleServer().setAddress("redis://10.211.55.5:6379");
        //2.根据Config创建出RedissonClient
        return Redisson.create(config);
    }
}

以上方式为但节点模式,也可以配置集群模式:

Config config = new Config();
config.useClusterServers()
    .setScanInterval(2000) // 集群状态扫描间隔时间,单位是毫秒
    //可以用"rediss://"来启用SSL连接
    .addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001")
    .addNodeAddress("redis://127.0.0.1:7002");

RedissonClient redisson = Redisson.create(config);

3.使用分布式锁进行redis占锁

 @Autowired
 RedissonClient redisson;

最常见的使用方法:

RLock lock = redisson.getLock("my-lock");
// 最常见的使用方法
lock.lock();

解释说明
使用基本锁以后,redisson使用了自动续期,如果业务超长,运行期间自动续上30s,不用担心业务时间长,锁自动过期被删掉。

大家都知道,如果负责储存这个分布式锁的Redisson节点宕机以后,而且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒钟,也可以通过修改Config.lockWatchdogTimeout来另行指定。

另外Redisson还通过加锁的方法提供了leaseTime的参数来指定加锁的时间。超过这个时间后锁便自动解开了。

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

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

项目使用以及说明

 public String hello(){
        //获取一把锁,只要锁的名字一样就是同一把锁
        RLock lock = redisson.getLock("my-lock");
        //2。加锁
//        lock.lock();
        //1).redisson的自动续期,如果业务超长,运行期间自动续上30s,不用担心业务时间长,锁自动过期被删掉
        //2).加锁得业务只要运行完成,就不会给当前锁续期,即使不手动解锁,锁默认在30s后自动删除
        lock.lock(10, TimeUnit.SECONDS);//10秒以后自动解锁,自动解锁时间一定要大于业务时间
//        lock.lock(10, TimeUnit.SECONDS)在锁时间到了以后,不会自动续期
        //1.如果我们传递了锁的超时时间,就发送给redis执行脚本,进行站锁,默认时间就是我我们传递的时间
        //2.如果我们危制定锁的超时时间,就使用lockWatchdogTimeout = 30 * 1000;看门狗默认时间
        //只要站锁成功,就会启动定时任务(重新给锁设置过期时间)新的时间就是看门狗的默认时间,每10秒,都会自动续期续成满时间

        //最佳实战
        //1)lock.lock(10, TimeUnit.SECONDS) 省略了整个续期操作,手动解锁
        try {
            System.out.println("加锁成功,执行业务"+lock.getName());
            Thread.sleep(30000);
        } catch (Exception e){
            System.out.println(e);
        } finally{
            //解锁
            System.out.println("释放锁"+lock.getName());
            lock.unlock();
        }
    return "hello";

    }

本文地址:https://blog.csdn.net/weixin_43691942/article/details/107591137

相关标签: Spring Boot java