ZooKeeper是一個(gè)分布式協(xié)調(diào)服務(wù),其中提供的序列化、持久化、有層次的目錄結(jié)構(gòu)使得它非常適合用于實(shí)現(xiàn)分布式鎖。在ZooKeeper中,分布式鎖通常通過臨時(shí)有序節(jié)點(diǎn)實(shí)現(xiàn)。以下是ZooKeeper分布式鎖的詳細(xì)介紹:
?實(shí)現(xiàn)方式:
-
臨時(shí)有序節(jié)點(diǎn):
- 當(dāng)一個(gè)客戶端需要獲取鎖時(shí),它在ZooKeeper上創(chuàng)建一個(gè)臨時(shí)有序節(jié)點(diǎn),節(jié)點(diǎn)的名稱包含一個(gè)自增的序列號(hào)。
- 客戶端創(chuàng)建節(jié)點(diǎn)的過程相當(dāng)于嘗試獲取鎖。
-
鎖競爭:
- 客戶端創(chuàng)建節(jié)點(diǎn)后,檢查它是否是當(dāng)前目錄中最小的節(jié)點(diǎn),如果是,則表示它獲取了鎖。
- 如果不是最小的節(jié)點(diǎn),客戶端監(jiān)聽上一個(gè)節(jié)點(diǎn),等待上一個(gè)節(jié)點(diǎn)釋放鎖。
-
鎖釋放:
- 當(dāng)客戶端不再需要鎖時(shí),它刪除相應(yīng)的節(jié)點(diǎn),其他等待的客戶端會(huì)收到通知,重新嘗試獲取鎖。
本篇文章基于Redis之高并發(fā)超賣問題解決方案_redis解決超賣 高并發(fā)-CSDN博客,在嘗試使用redisson實(shí)現(xiàn)分布式鎖后,這里嘗試使用zookeeper實(shí)現(xiàn)分布式鎖。
?代碼如下:
導(dǎo)入依賴:
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.0</version>
</dependency>
秒殺接口測試:
在redis中設(shè)計(jì)product_1:200
@RestController
public class MyController {
private static InterProcessMutex lock; //可重入鎖
@PostConstruct
public void init(){
RetryPolicy retry = new ExponentialBackoffRetry(3000,10);
CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
.connectString("localhost:2181")
.retryPolicy(retry)
.build();
curatorFramework.start();
lock= new InterProcessMutex(curatorFramework, "/lock");
}
@RequestMapping("/buy/{id}")
public String buy(@PathVariable("id") Long id){
String message="error";
String key="product_" + id;
//try catch 設(shè)計(jì)是為了防止在執(zhí)行業(yè)務(wù)的時(shí)候出現(xiàn)異常導(dǎo)致redis鎖一直無法釋放
try {
//加鎖
lock.acquire();
int count = Integer.parseInt(stringRedisTemplate.opsForValue().get(key));
if (count > 0) {
stringRedisTemplate.opsForValue().set(key, String.valueOf(--count));
System.out.println(key + "商品購買成功,剩余庫存" + count);
message="success";
}
}catch (Throwable e){
e.printStackTrace();
}finally {
try {
//解鎖
lock.release();
} catch (Exception e) {
e.printStackTrace();
}
}
if(message.equals("error"))
System.out.println(key+"商品庫存不足");
return message;
}
}
jmeter壓測結(jié)果如下:
文章來源:http://www.zghlxwxcb.cn/news/detail-787672.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-787672.html
到了這里,關(guān)于Zookeeper實(shí)現(xiàn)分布式鎖的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!