redis 分布式锁 看门狗_分布式锁Redisson的使用,看门狗机制
Redisson簡介
Redisson是一個(gè)在Redis的基礎(chǔ)上實(shí)現(xiàn)的Java駐內(nèi)存數(shù)據(jù)網(wǎng)格(In-Memory Data Grid)。它不僅提供了一系列的分布式的Java常用對象,還提供了許多分布式服務(wù)。其中包括(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的宗旨是促進(jìn)使用者對Redis的關(guān)注分離(Separation of Concern),從而讓使用者能夠?qū)⒕Ω械胤旁谔幚順I(yè)務(wù)邏輯上。
Redisson使用
1.引入依賴
org.redisson
redisson
3.12.0
2.編寫配置類,初始化一個(gè)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 創(chuàng)建配置
Config config = new Config();
config.useSingleServer().setAddress("redis://10.211.55.5:6379");
//2.根據(jù)Config創(chuàng)建出RedissonClient
return Redisson.create(config);
}
}
以上方式為但節(jié)點(diǎn)模式,也可以配置集群模式:
Config config = new Config();
config.useClusterServers()
.setScanInterval(2000) // 集群狀態(tài)掃描間隔時(shí)間,單位是毫秒
//可以用"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.使用分布式鎖進(jìn)行redis占鎖
@Autowired
RedissonClient redisson;
最常見的使用方法:
RLock lock = redisson.getLock("my-lock");
// 最常見的使用方法
lock.lock();
解釋說明
使用基本鎖以后,redisson使用了自動(dòng)續(xù)期,如果業(yè)務(wù)超長,運(yùn)行期間自動(dòng)續(xù)上30s,不用擔(dān)心業(yè)務(wù)時(shí)間長,鎖自動(dòng)過期被刪掉。
大家都知道,如果負(fù)責(zé)儲(chǔ)存這個(gè)分布式鎖的Redisson節(jié)點(diǎn)宕機(jī)以后,而且這個(gè)鎖正好處于鎖住的狀態(tài)時(shí),這個(gè)鎖會(huì)出現(xiàn)鎖死的狀態(tài)。為了避免這種情況的發(fā)生,Redisson內(nèi)部提供了一個(gè)監(jiān)控鎖的看門狗,它的作用是在Redisson實(shí)例被關(guān)閉前,不斷的延長鎖的有效期。默認(rèn)情況下,看門狗的檢查鎖的超時(shí)時(shí)間是30秒鐘,也可以通過修改Config.lockWatchdogTimeout來另行指定。
另外Redisson還通過加鎖的方法提供了leaseTime的參數(shù)來指定加鎖的時(shí)間。超過這個(gè)時(shí)間后鎖便自動(dòng)解開了。
// 加鎖以后10秒鐘自動(dòng)解鎖
// 無需調(diào)用unlock方法手動(dòng)解鎖
lock.lock(10, TimeUnit.SECONDS);
// 嘗試加鎖,最多等待100秒,上鎖以后10秒自動(dòng)解鎖
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
if (res) {
try {
...
} finally {
lock.unlock();
}
}
項(xiàng)目使用以及說明
public String hello(){
//獲取一把鎖,只要鎖的名字一樣就是同一把鎖
RLock lock = redisson.getLock("my-lock");
//2。加鎖
// lock.lock();
//1).redisson的自動(dòng)續(xù)期,如果業(yè)務(wù)超長,運(yùn)行期間自動(dòng)續(xù)上30s,不用擔(dān)心業(yè)務(wù)時(shí)間長,鎖自動(dòng)過期被刪掉
//2).加鎖得業(yè)務(wù)只要運(yùn)行完成,就不會(huì)給當(dāng)前鎖續(xù)期,即使不手動(dòng)解鎖,鎖默認(rèn)在30s后自動(dòng)刪除
lock.lock(10, TimeUnit.SECONDS);//10秒以后自動(dòng)解鎖,自動(dòng)解鎖時(shí)間一定要大于業(yè)務(wù)時(shí)間
// lock.lock(10, TimeUnit.SECONDS)在鎖時(shí)間到了以后,不會(huì)自動(dòng)續(xù)期
//1.如果我們傳遞了鎖的超時(shí)時(shí)間,就發(fā)送給redis執(zhí)行腳本,進(jìn)行站鎖,默認(rèn)時(shí)間就是我我們傳遞的時(shí)間
//2.如果我們危制定鎖的超時(shí)時(shí)間,就使用lockWatchdogTimeout = 30 * 1000;看門狗默認(rèn)時(shí)間
//只要站鎖成功,就會(huì)啟動(dòng)定時(shí)任務(wù)(重新給鎖設(shè)置過期時(shí)間)新的時(shí)間就是看門狗的默認(rèn)時(shí)間,每10秒,都會(huì)自動(dòng)續(xù)期續(xù)成滿時(shí)間
//最佳實(shí)戰(zhàn)
//1)lock.lock(10, TimeUnit.SECONDS) 省略了整個(gè)續(xù)期操作,手動(dòng)解鎖
try {
System.out.println("加鎖成功,執(zhí)行業(yè)務(wù)"+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
如您對本文有疑問或者有任何想說的,請點(diǎn)擊進(jìn)行留言回復(fù),萬千網(wǎng)友為您解惑!
總結(jié)
以上是生活随笔為你收集整理的redis 分布式锁 看门狗_分布式锁Redisson的使用,看门狗机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器的虚拟化配置,怎么配置服务器的虚拟
- 下一篇: 开发黑名单功能demo_中台实践:通用化