日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Redis鎖的不同形式與分類(redis鎖的種類)

Redis鎖是Redis的一種功能,它可以在不同的進程和服務之間互斥訪問共享資源,以避免資源競爭,因此被廣泛的應用在各種場景中,比如控制訪問頻率、防止緩存雪崩等。Redis鎖有很多種不同的形式,分為4種類型:期限鎖、可重入鎖、計數(shù)鎖、分布式鎖。

1. 期限鎖:期限鎖是一種讓工作程序擁有指定的租用期限的鎖,租用時間超過期限后,就會被自動釋放,避免了死鎖問題導致工作程序卡死的情況。這種鎖可以有效的防止一個長時間執(zhí)行的任務耗費過多的系統(tǒng)資源。

例子:

 string lockKEY = "example_key";
long lockExpire = 18000;//單位:s

String lockValue = String.valueOf(System.nanoTime());
if(redisTemplate.opsForValue().setIfAbsent(lockKey,lockValue)){
redisTemplate.expire(lockKey, lockExpire, TimeUnit.SECONDS);
//doSomething
//釋放鎖
String currentlockValue = redisTemplate.opsForValue().get(lockKey).toString();
if(currentlockValue == lockValue){
redisTemplate.delete(lockKey);
}
}

2. 可重入鎖:可重入鎖又稱為遞歸鎖或可遞歸鎖,具有非常實用的可重入性,獲取鎖定的線程可以在釋放鎖之前多次獲取該線程,是一種常用的鎖定策略。

例子:

 private ThreadLocal> threadLocalmap = new ThreadLocal>();

public void lock(String key){
獲取鎖信息
String lock = redisTemplate.opsForValue().get(key);
//判斷獲取的鎖是否等于當前的線程
if(lock.equals(Thread.currentThread().toString())){
Map threadMap= threadLocalMap.get();
//若是空值
if(threadMap==null){
threadMap=new HashMap();
threadMap.put(key,1);
} else {
int lockCount= threadMap.get(key);
threadMap.put(key,++lockCount);
}
return;
}

//若不是
try {
do {
Thread.sleep(10);
} while (!redisTemplate.opsForValue().setIfAbsent(key, Thread.currentThread().toString()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public void unlock(String key){
Map threadMap= threadLocalMap.get();
if(threadMap==null){
return;
}
int lockCount= threadMap.get(key);
if(lockCount==1){
redisTemplate.delete(key);
} else {
threadMap.put(key,--lockCount);
}
}

3. 計數(shù)鎖:計數(shù)鎖是Redis的一種典型的分布式鎖,通過Redis的原子操作實現(xiàn),可以防止其他進程搶占鎖失敗回滾的情況發(fā)生。當多個進程拿同一個鎖時,計數(shù)鎖可以用來區(qū)分各個進程的獲取次數(shù),以便更好的實現(xiàn)一致性的操作。

例子:

    private ThreadLocal> threadLocalMap = new ThreadLocal>();

public void lock(String key) {
lock = redisTemplate.opsForValue().get(key);

// 獲取鎖計數(shù)
int lockCount = getLockCount(lock);

if (lockCount > 0) {
// 鎖數(shù)量大于最大可用數(shù)量
return;
}

// 鎖數(shù)量小于最大可用數(shù)量,設置鎖并記錄本地線程計數(shù)
if (redisTemplate.opsForValue().setIfAbsent(key, threadLocalMap.get().toString())) {
Map threadMap = threadLocalMap.get();
if (threadMap == null) {
threadMap = new HashMap();
threadMap.put(key, 1);
} else {
int threadCount = threadMap.get(key);
threadMap.put(key, ++threadCount);
}
return;
}
}

public void unlock(String key) {
Map threadMap = threadLocalMap.get();
if (threadMap == null) {
return;
}
int lockCount= threadMap.get(key);
if(lockCount==1){
redisTemplate.delete(key);
} else {
threadMap.put(key,--lockCount);
}
}

4. 分布式鎖:Redis分布式鎖是Redis最流行的分布式鎖技術之一,它可以在多臺服務器之間共享鎖,防止資源搶占,保證了資源的有效調(diào)度。基于Redis的分布式鎖有兩種實現(xiàn)機制:SETNX和lua腳本,SETNX指令可

香港服務器選創(chuàng)新互聯(lián),香港虛擬主機被稱為香港虛擬空間/香港網(wǎng)站空間,或者簡稱香港主機/香港空間。香港虛擬主機特點是免備案空間開通就用, 創(chuàng)新互聯(lián)香港主機精選cn2+bgp線路訪問快、穩(wěn)定!


網(wǎng)頁題目:Redis鎖的不同形式與分類(redis鎖的種類)
本文網(wǎng)址:http://www.dlmjj.cn/article/djidehs.html