redis 分布式锁 看门狗_分布式锁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.引入依賴
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
如您對本文有疑問或者有任何想說的,請點擊進行留言回復,萬千網友為您解惑!
總結
以上是生活随笔為你收集整理的redis 分布式锁 看门狗_分布式锁Redisson的使用,看门狗机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器的虚拟化配置,怎么配置服务器的虚拟
- 下一篇: linux的mysql本地yum安装_l