-
Redis是基礎(chǔ)客戶端庫,可用于執(zhí)行基本操作。
-
Redisson是基于Redis的Java客戶端,提供高級功能如分布式鎖、分布式集合和分布式對象。
-
Redisson提供更友好的API,支持異步和響應(yīng)式編程,提供內(nèi)置線程安全和失敗重試機(jī)制。
實現(xiàn)步驟:
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.12.0</version>
</dependency>
@Configuration
public class MyRedissonConfig {
@Bean
public RedissonClient redisson(){
Config config = new Config();
config.useSingleServer().setAddress("redis://192.168.127.129:6379");
RedissonClient redissonClient = Redisson.create(config);
return redissonClient;
}
}
通過導(dǎo)入坐標(biāo)和配置,注入RedissonClient對象之后,就可以通過API操作
如:獲取可重入鎖
@ResponseBody //因為返回的是json數(shù)據(jù)
@GetMapping("/hello")
public String hello(){
//獲取一把鎖 只要鎖的名字一樣就是通一把鎖 是一個可重入的鎖
RLock myLock = redissonClient.getLock("myLock");
/**
*
* 默認(rèn)都是30s
* 加鎖 阻塞式等待 鎖的自動續(xù)期看門狗原理(如果業(yè)務(wù)超長,會在運行期間自動給鎖續(xù)上新的30秒)
* 不要擔(dān)心鎖自動過期被刪除
* 加鎖的業(yè)務(wù)完成,就不會續(xù)期,即使不手動解鎖,鎖也會在30秒之后自動解鎖 所有不會有死鎖問題
*/
// myLock.lock();//阻塞式等待
myLock.lock(10, TimeUnit.SECONDS);//獲取鎖之后10秒之后自動解鎖 不會自動續(xù)期 自動解鎖時間一定要大于業(yè)務(wù)執(zhí)行事件 注意使用
try {
//業(yè)務(wù)代碼
System.out.println("加鎖成功 執(zhí)行業(yè)務(wù)。。。。"+ Thread.currentThread().getId());
Thread.sleep(20000);
}catch (Exception e){
}finally {
//解鎖
System.out.println("釋放鎖。。。。"+ Thread.currentThread().getId());
myLock.unlock();
}
return "hello";
}
讀寫鎖:保證一定能讀到最新數(shù)據(jù),修改期間寫鎖是一個排他鎖
????????如果都是讀,則都會同時加鎖成功,可以理解為無鎖
????????如果先寫后讀,則必須等待寫鎖釋放才行
????????如果同時寫,也必須等待寫鎖釋放才行,阻塞的方式、如何
? ? ? ? 如果先讀后寫,也必須等待讀鎖釋放
寫鎖:是一個互斥鎖
讀鎖:是一個共享鎖,和無鎖是一樣的
????????
@ResponseBody //因為返回的是json數(shù)據(jù)
@GetMapping("/read")
public String readValue(){
//獲取讀寫鎖
RReadWriteLock readWriteLock = redissonClient.getReadWriteLock("rw-Lock");
String s = "";
RLock rLock = readWriteLock.readLock();
rLock.lock();
try{
s = redisTemplate.opsForValue().get("rwLock");
}catch (Exception e){
}finally {
rLock.unlock();
}
return s;
}
@ResponseBody //因為返回的是json數(shù)據(jù)
@GetMapping("/write")
public String writeValue(){
//獲取讀寫鎖
RReadWriteLock readWriteLock = redissonClient.getReadWriteLock("rw-Lock");
RLock rLock = readWriteLock.writeLock();
String s = UUID.randomUUID().toString();
try{
rLock.lock();
redisTemplate.opsForValue().set("rwLock", s);
Thread.sleep(30000);
}catch (Exception e){
}finally {
rLock.unlock();
}
return s;
}
?信號量:典型案例車庫停車等。。。。
閉鎖:案例放假 鎖門?
?文章來源地址http://www.zghlxwxcb.cn/news/detail-667405.html文章來源:http://www.zghlxwxcb.cn/news/detail-667405.html
?
到了這里,關(guān)于Redisson 分布式鎖的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!