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

本文介绍了Redisson作为Java驻内存数据网格的使用,包括如何配置Redisson客户端,以及如何使用分布式锁。重点讲解了Redisson的看门狗机制,它能自动延长锁的有效期,防止因Redisson节点宕机导致的锁死问题。同时,文章讨论了不同加锁方法的超时和自动解锁功能,并给出具体示例代码。
摘要由CSDN通过智能技术生成

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.引入依赖

org.redisson

redisson

3.12.0

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

希望与广大网友互动??

点此进行留言吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值