国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于zookeeper實現(xiàn)分布式鎖

這篇具有很好參考價值的文章主要介紹了基于zookeeper實現(xiàn)分布式鎖。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

zookeeper知識點復(fù)習

相關(guān)概念

java客戶端操作

實現(xiàn)思路分析?

基本實現(xiàn)

初始化鏈接

代碼落地?

優(yōu)化:性能優(yōu)化

?實現(xiàn)阻塞鎖

監(jiān)聽實現(xiàn)阻塞鎖

優(yōu)化:可重入鎖

zk分布式鎖小結(jié)?


zookeeper知識點復(fù)習

Zookeeper(業(yè)界簡稱zk)是一種提供配置管理、分布式協(xié)同以及命名的中心化服務(wù),這些提供的
功能都是分布式系統(tǒng)中非常底層且必不可少的基本功能,但是如果自己實現(xiàn)這些功能而且要達到高吞吐、低延遲同時還要保持一致性和可用性,實際上非常困難。因此zookeeper提供了這些功能,開發(fā)者在zookeeper之上構(gòu)建自己的各種分布式系統(tǒng)。

相關(guān)概念

Zookeeper提供一個多層級的節(jié)點命名空間(節(jié)點稱為znode),每個節(jié)點都用一個以斜杠(/)分隔的路徑表示,而且每個節(jié)點都有父節(jié)點(根節(jié)點除外),非常類似于文件系統(tǒng)。并且每個節(jié)點都是唯一的。

znode節(jié)點有四種類型:

  • PERSISTENT:永久節(jié)點??蛻舳伺czookeeper斷開連接后,該節(jié)點依舊存在
  • EPHEMERAL:臨時節(jié)點??蛻舳伺czookeeper斷開連接后,該節(jié)點被刪除
  • PERSISTENT_SEQUENTIAL:永久節(jié)點、序列化。客戶端與zookeeper斷開連接后,該節(jié)點依舊存在,只是Zookeeper給該節(jié)點名稱進行順序編號
  • EPHEMERAL_SEQUENTIAL:臨時節(jié)點、序列化??蛻舳伺czookeeper斷開連接后,該節(jié)點被刪除,只是Zookeeper給該節(jié)點名稱進行順序編號

創(chuàng)建這四種節(jié)點:

基于zookeeper實現(xiàn)分布式鎖?事件監(jiān)聽:在讀取數(shù)據(jù)時,我們可以同時對節(jié)點設(shè)置事件監(jiān)聽,當節(jié)點數(shù)據(jù)或結(jié)構(gòu)變化時,zookeeper會通知客戶端。當前zookeeper有如下四種事件:
1. 節(jié)點創(chuàng)建
2. 節(jié)點刪除
3. 節(jié)點數(shù)據(jù)修改
4. 子節(jié)點變更

java客戶端操作

1. 引入依賴

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.14</version>
</dependency>

2. 常用api及其方法

初始化zookeeper客戶端類,負責建立與zkServer的會話?

       new ZooKeeper(connectString, 30000, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println("獲取鏈接成功??!");
            }
        });

創(chuàng)建一個節(jié)點,1-節(jié)點路徑 2-節(jié)點內(nèi)容 3-訪問控制控制 4-節(jié)點類型?


 String fullPath = zooKeeper.create(path, null, ZooDefs.Ids.OPEN_ACL_UNSAFE,
                CreateMode.PERSISTENT);

判斷一個節(jié)點是否存在

Stat stat = zooKeeper.exists(rootPath, false);
if (stat != null) {...}

查詢一個節(jié)點的內(nèi)容?

 Stat stat = new Stat();
 byte[] data = zooKeeper.getData(path, false, stat);

更新一個節(jié)點?

zooKeeper.setData(rootPath, new byte[]{}, stat.getVersion() + 1);

刪除一個節(jié)點?

 zooKeeper.delete(path, stat.getVersion());

查詢一個節(jié)點的子節(jié)點列表?

List<String> children = zooKeeper.getChildren(rootPath, false);

關(guān)閉鏈接?

if (zooKeeper != null) {
       zooKeeper.close();
   }

實現(xiàn)思路分析?

?分布式鎖的步驟:
1. 獲取鎖:create一個節(jié)點
2. 刪除鎖:delete一個節(jié)點
3. 重試:沒有獲取到鎖的請求重試
參照redis分布式鎖的特點:
????????1. 互斥 排他
????????2. 防死鎖:

????????1. 可自動釋放鎖(臨時節(jié)點) :獲得鎖之后客戶端所在機器宕機了,客戶端沒有主動刪除子節(jié)點;如果創(chuàng)建的是永久的節(jié)點,那么這個鎖永遠不會釋放,導(dǎo)致死鎖;由于創(chuàng)建的是臨時節(jié)點,客戶端宕機后,過了一定時間zookeeper沒有收到客戶端的心跳包判斷會話失效,將臨時節(jié)點刪除從而釋放鎖。
????????2. 可重入鎖:借助于ThreadLocal

3. 防誤刪:宕機自動釋放臨時節(jié)點,不需要設(shè)置過期時間,也就不存在誤刪問題。
4. 加鎖/解鎖要具備原子性
5. 單點問題:使用Zookeeper可以有效的解決單點問題,ZK一般是集群部署的。
6. 集群問題:zookeeper集群是強一致性的,只要集群中有半數(shù)以上的機器存活,就可以對外提供服務(wù)。

基本實現(xiàn)

實現(xiàn)思路:
1. 多個請求同時添加一個相同的臨時節(jié)點,只有一個可以添加成功。添加成功的獲取到鎖
2. 執(zhí)行業(yè)務(wù)邏輯
3. 完成業(yè)務(wù)流程后,刪除節(jié)點釋放鎖。

初始化鏈接

由于zookeeper獲取鏈接是一個耗時過程,這里可以在項目啟動時,初始化鏈接,并且只初始化一次。借助于spring特性,代碼實現(xiàn)如下:

@Component
public class zkClient {
    private static final String connectString = "192.168.107.135";

    private static final String ROOT_PATH = "/distributed";

    private ZooKeeper zooKeeper;

    @PostConstruct
    public void init() throws IOException {
        this.zooKeeper = new ZooKeeper(connectString, 30000, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                System.out.println("zookeeper 獲取鏈接成功");
            }
        });
        //創(chuàng)建分布式鎖根節(jié)點
        try {
            if (this.zooKeeper.exists(ROOT_PATH, false) == null) {
                this.zooKeeper.create(ROOT_PATH, null,
                        ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            }
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @PreDestroy
    public void destroy() {
        if (zooKeeper != null) {
            try {
                zooKeeper.close();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 初始化分布式對象方法
     */
    public ZkDistributedLock getZkDistributedLock(String lockname){
        return new ZkDistributedLock(zooKeeper,lockname);
    }
}

代碼落地?

public class ZkDistributedLock {
    public static final String ROOT_PATH = "/distribute";
    private String path;
    private ZooKeeper zooKeeper;


    public ZkDistributedLock(ZooKeeper zooKeeper, String lockname) {
        this.zooKeeper = zooKeeper;
        this.path = ROOT_PATH + "/" + lockname;
    }

    public void lock() {
        try {
            zooKeeper.create(path, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        try {
            Thread.sleep(200);
            lock();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public  void  unlock(){
        try {
            this.zooKeeper.delete(path,0);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (KeeperException e) {
            e.printStackTrace();
        }

    }
}

改造StockService的checkAndLock方法:

    @Autowired
    private zkClient client;
    
    public void checkAndLock() {
        // 加鎖,獲取鎖失敗重試
        ZkDistributedLock lock = this.client.getZkDistributedLock("lock");
        lock.lock();
        // 先查詢庫存是否充足
        Stock stock = this.stockMapper.selectById(1L);
        // 再減庫存
        if (stock != null && stock.getCount() > 0) {
            stock.setCount(stock.getCount() - 1);
            this.stockMapper.updateById(stock);
        }
        lock.unlock();
    }

Jmeter壓力測試:

基于zookeeper實現(xiàn)分布式鎖?性能一般,mysql數(shù)據(jù)庫的庫存余量為0(注意:所有測試之前都要先修改庫存量為5000)

基本實現(xiàn)存在的問題:
????????1. 性能一般(比mysql略好)
????????2. 不可重入

接下來首先來提高性能

優(yōu)化:性能優(yōu)化

基本實現(xiàn)中由于無限自旋影響性能:

基于zookeeper實現(xiàn)分布式鎖

試想:每個請求要想正常的執(zhí)行完成,最終都是要創(chuàng)建節(jié)點,如果能夠避免爭搶必然可以提高性能。這里借助于zk的臨時序列化節(jié)點,實現(xiàn)分布式鎖:?

基于zookeeper實現(xiàn)分布式鎖

?實現(xiàn)阻塞鎖

代碼實現(xiàn):

public class ZkDistributedLock {
    public static final String ROOT_PATH = "/distribute";
    private String path;
    private ZooKeeper zooKeeper;


    public ZkDistributedLock(ZooKeeper zooKeeper, String lockname) {
        this.zooKeeper = zooKeeper;
        try {
            this.path = zooKeeper.create(ROOT_PATH + "/" + lockname + "_",
                    null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void lock() {
        String preNode = getpreNode(path);
        //如果該節(jié)點沒有前一個節(jié)點,說明該節(jié)點是最小的節(jié)點
        if (StringUtils.isEmpty(preNode)) {
            return;
        }
        //重新檢查是否獲取到鎖
        try {
            Thread.sleep(20);
            lock();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取指定節(jié)點的前節(jié)點
     *
     * @param path
     * @return
     */
    private String getpreNode(String path) {
        //獲取當前節(jié)點的序列化序號
        Long curSerial = Long.valueOf(StringUtil.substringAfter(path, '_'));
        //獲取根路徑下的所有序列化子節(jié)點
        try {
            List<String> nodes = this.zooKeeper.getChildren(ROOT_PATH, false);
            //判空處理
            if (CollectionUtils.isEmpty(nodes)) {
                return null;
            }
            //獲取前一個節(jié)點
            Long flag = 0L;
            String preNode = null;
            for (String node : nodes) {
                //獲取每個節(jié)點的序列化號
                Long serial = Long.valueOf(StringUtil.substringAfter(path, '_'));
                if (serial < curSerial && serial > flag) {
                    flag = serial;
                    preNode = node;
                }
            }
            return preNode;
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    public void unlock() {
        try {
            this.zooKeeper.delete(path, 0);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (KeeperException e) {
            e.printStackTrace();
        }

    }
}

主要修改了構(gòu)造方法和lock方法:

基于zookeeper實現(xiàn)分布式鎖

?并添加了getPreNode獲取前置節(jié)點的方法。

測試結(jié)果如下:

基于zookeeper實現(xiàn)分布式鎖

?性能反而更弱了。

原因:雖然不用反復(fù)爭搶創(chuàng)建節(jié)點了,但是會自選判斷自己是最小的節(jié)點,這個判斷邏輯反而更復(fù)雜更 耗時。

解決方案:監(jiān)聽實現(xiàn)阻塞鎖

監(jiān)聽實現(xiàn)阻塞鎖

對于這個算法有個極大的優(yōu)化點:假如當前有1000個節(jié)點在等待鎖,如果獲得鎖的客戶端釋放鎖時,這1000個客戶端都會被喚醒,這種情況稱為“羊群效應(yīng)”;在這種羊群效應(yīng)中,zookeeper需要通知1000個 客戶端,這會阻塞其他的操作,最好的情況應(yīng)該只喚醒新的最小節(jié)點對應(yīng)的客戶端。應(yīng)該怎么做呢?在 設(shè)置事件監(jiān)聽時,每個客戶端應(yīng)該對剛好在它之前的子節(jié)點設(shè)置事件監(jiān)聽,例如子節(jié)點列表 為/lock/lock-0000000000、/lock/lock-0000000001、/lock/lock-0000000002,序號為1的客戶端監(jiān)聽 序號為0的子節(jié)點刪除消息,序號為2的監(jiān)聽序號為1的子節(jié)點刪除消息。

所以調(diào)整后的分布式鎖算法流程如下:

  • 客戶端連接zookeeper,并在/lock下創(chuàng)建臨時的且有序的子節(jié)點,第一個客戶端對應(yīng)的子節(jié)點 為/lock/lock-0000000000,第二個為/lock/lock-0000000001,以此類推;
  • 客戶端獲取/lock下的子節(jié)點列表,判斷自己創(chuàng)建的子節(jié)點是否為當前子節(jié)點列表中序號最小的子 節(jié)點,如果是則認為獲得鎖,否則監(jiān)聽剛好在自己之前一位的子節(jié)點刪除消息,獲得子節(jié)點變更通 知后重復(fù)此步驟直至獲得鎖;
  • 執(zhí)行業(yè)務(wù)代碼;
  • 完成業(yè)務(wù)流程后,刪除對應(yīng)的子節(jié)點釋放鎖。

改造ZkDistributedLock的lock方法:

    public void lock() {
        String preNode = getpreNode(path);
        //如果該節(jié)點沒有前一個節(jié)點,說明該節(jié)點是最小的節(jié)點
        if (StringUtils.isEmpty(preNode)) {
            return;
        } else {
            CountDownLatch countDownLatch = new CountDownLatch(1);
            try {
                if (this.zooKeeper.exists(ROOT_PATH + "/" + preNode, watchedEvent -> {
                    countDownLatch.countDown();
                }) == null) {
                    return;
                }
                countDownLatch.await();
                return;

            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            lock();
        }
    }

壓力測試效果如下:

基于zookeeper實現(xiàn)分布式鎖

?由此可見性能提高不少僅次于redis的分布式鎖

優(yōu)化:可重入鎖

引入ThreadLocal線程局部變量保證zk分布式鎖的可重入性。

在對應(yīng)的線程的存儲數(shù)據(jù)

public class ZkDistributedLock {
    public static final String ROOT_PATH = "/distribute";
    private String path;
    private ZooKeeper zooKeeper;
    private static final ThreadLocal<Integer> THREAD_LOCAL = new ThreadLocal<>();


    public ZkDistributedLock(ZooKeeper zooKeeper, String lockname) {
        this.zooKeeper = zooKeeper;
        try {
            this.path = zooKeeper.create(ROOT_PATH + "/" + lockname + "_",
                    null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void lock() {
        Integer flag = THREAD_LOCAL.get();
        if (flag != null && flag > 0) {
            THREAD_LOCAL.set(flag + 1);
            return;
        }
        String preNode = getpreNode(path);
        //如果該節(jié)點沒有前一個節(jié)點,說明該節(jié)點是最小的節(jié)點
        if (StringUtils.isEmpty(preNode)) {
            return;
        } else {
            CountDownLatch countDownLatch = new CountDownLatch(1);
            try {
                if (this.zooKeeper.exists(ROOT_PATH + "/" + preNode, watchedEvent -> {
                    countDownLatch.countDown();
                }) == null) {
                    return;
                }
                countDownLatch.await();
                THREAD_LOCAL.set(1);
                return;

            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            lock();
        }
    }

    /**
     * 獲取指定節(jié)點的前節(jié)點
     *
     * @param path
     * @return
     */
    private String getpreNode(String path) {
        //獲取當前節(jié)點的序列化序號
        Long curSerial = Long.valueOf(StringUtil.substringAfter(path, '_'));
        //獲取根路徑下的所有序列化子節(jié)點
        try {
            List<String> nodes = this.zooKeeper.getChildren(ROOT_PATH, false);
            //判空處理
            if (CollectionUtils.isEmpty(nodes)) {
                return null;
            }
            //獲取前一個節(jié)點
            Long flag = 0L;
            String preNode = null;
            for (String node : nodes) {
                //獲取每個節(jié)點的序列化號
                Long serial = Long.valueOf(StringUtil.substringAfter(path, '_'));
                if (serial < curSerial && serial > flag) {
                    flag = serial;
                    preNode = node;
                }
            }
            return preNode;
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    public void unlock() {
        try {
            THREAD_LOCAL.set(THREAD_LOCAL.get() - 1);
            if (THREAD_LOCAL.get() == 0) {
                this.zooKeeper.delete(path, 0);
                THREAD_LOCAL.remove();
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (KeeperException e) {
            e.printStackTrace();
        }

    }
}

基于zookeeper實現(xiàn)分布式鎖

基于zookeeper實現(xiàn)分布式鎖

zk分布式鎖小結(jié)?

參照redis分布式鎖的特點:
1. 互斥 排他:zk節(jié)點的不可重復(fù)性,以及序列化節(jié)點的有序性
2. 防死鎖:
????????1. 可自動釋放鎖:臨時節(jié)點
????????2. 可重入鎖:借助于ThreadLocal
3. 防誤刪:臨時節(jié)點
4. 加鎖/解鎖要具備原子性
5. 單點問題:使用Zookeeper可以有效的解決單點問題,ZK一般是集群部署的。
6. 集群問題:zookeeper集群是強一致性的,只要集群中有半數(shù)以上的機器存活,就可以對外提供服務(wù)。
7. 公平鎖:有序性節(jié)點文章來源地址http://www.zghlxwxcb.cn/news/detail-433256.html

到了這里,關(guān)于基于zookeeper實現(xiàn)分布式鎖的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 在Spring中,可以使用不同的方式來實現(xiàn)分布式鎖,例如基于數(shù)據(jù)庫、Redis、ZooKeeper等

    在Spring中,可以使用不同的方式來實現(xiàn)分布式鎖,例如基于數(shù)據(jù)庫、Redis、ZooKeeper等

    在Spring中,可以使用不同的方式來實現(xiàn)分布式鎖,例如基于數(shù)據(jù)庫、Redis、ZooKeeper等。下面是兩種常見的實現(xiàn)方式: 使用Redis實現(xiàn)分布式鎖: 使用自定義注解實現(xiàn)本地鎖: 以上是兩種常見的在Spring中實現(xiàn)分布式鎖的方式。第一種方式使用Redis作為分布式鎖的存儲介質(zhì),通過

    2024年03月17日
    瀏覽(24)
  • Zookeeper 和 Redis 哪種更好? 為什么使用分布式鎖? 1. 利用 Redis 提供的 第二種,基于 ZK 實現(xiàn)分布式鎖的落地方案 對于 redis 的分布式鎖而言,它有以下缺點:

    關(guān)于這個問題,我們 可以從 3 個方面來說: 為什么使用分布式鎖? 使用分布式鎖的目的,是為了保證同一時間只有一個 JVM 進程可以對共享資源進行操作。 根據(jù)鎖的用途可以細分為以下兩類: 允許多個客戶端操作共享資源,我們稱為共享鎖 這種鎖的一般是對共享資源具有

    2024年01月16日
    瀏覽(23)
  • 分布式鎖解決方案_Zookeeper實現(xiàn)分布式鎖

    提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 分布式鎖解決方案_Zookeeper實現(xiàn)分布式鎖 提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 提示:這里可以添加本文要記錄的大概內(nèi)容: Zookeeper 是一個開源的分布式協(xié)調(diào)服務(wù),它

    2024年02月03日
    瀏覽(16)
  • Zookeeper實現(xiàn)分布式鎖

    Zookeeper實現(xiàn)分布式鎖

    ZooKeeper是一個分布式協(xié)調(diào)服務(wù),其中提供的序列化、持久化、有層次的目錄結(jié)構(gòu)使得它非常適合用于實現(xiàn)分布式鎖。在ZooKeeper中,分布式鎖通常通過臨時有序節(jié)點實現(xiàn)。以下是ZooKeeper分布式鎖的詳細介紹: ?實現(xiàn)方式: 臨時有序節(jié)點: 當一個客戶端需要獲取鎖時,它在ZooK

    2024年02月02日
    瀏覽(29)
  • 使用ZooKeeper實現(xiàn)分布式鎖

    目錄 引言 1. ZooKeeper簡介 2. 分布式鎖實現(xiàn)原理 3. 分布式鎖實現(xiàn)步驟 步驟一:創(chuàng)建ZooKeeper客戶端 步驟二:創(chuàng)建分布式鎖類 步驟三:使用分布式鎖 4. 總結(jié) 在分布式系統(tǒng)中,實現(xiàn)分布式鎖是一項常見的任務(wù),可以用于保證同一時間只有一個客戶端可以訪問共享資源,從而避免競

    2024年02月21日
    瀏覽(20)
  • 【分布式鎖】06-Zookeeper實現(xiàn)分布式鎖:可重入鎖源碼分析

    前言 前面已經(jīng)講解了Redis的客戶端Redission是怎么實現(xiàn)分布式鎖的,大多都深入到源碼級別。 在分布式系統(tǒng)中,常見的分布式鎖實現(xiàn)方案還有Zookeeper,接下來會深入研究Zookeeper是如何來實現(xiàn)分布式鎖的。 Zookeeper初識 文件系統(tǒng) Zookeeper維護一個類似文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu) image.png 每

    2024年02月22日
    瀏覽(19)
  • springboot 使用zookeeper實現(xiàn)分布式隊列

    一.添加ZooKeeper依賴:在pom.xml文件中添加ZooKeeper客戶端的依賴項。例如,可以使用Apache Curator作為ZooKeeper客戶端庫: 二.創(chuàng)建ZooKeeper連接:在應(yīng)用程序的配置文件中,配置ZooKeeper服務(wù)器的連接信息。例如,在application.properties文件中添加以下配置:? 三.創(chuàng)建分布式隊列:使用Z

    2024年02月13日
    瀏覽(24)
  • Zookeeper實戰(zhàn)——分布式鎖實現(xiàn)以及原理

    Zookeeper實戰(zhàn)——分布式鎖實現(xiàn)以及原理

    分布式鎖是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式。分布式鎖的實現(xiàn)方式有很多種,比如 Redis 、數(shù)據(jù)庫 、 zookeeper 等。這篇文章主要介紹用 Zookeeper 實現(xiàn)分布式鎖。 先說結(jié)論: Zookeeper 是基于臨時順序節(jié)點以及 Watcher 監(jiān)聽器機制實現(xiàn)分布式鎖的 。 (1)ZooKeeper 的每

    2023年04月08日
    瀏覽(17)
  • springboot 使用zookeeper實現(xiàn)分布式鎖

    一.添加ZooKeeper依賴:在pom.xml文件中添加ZooKeeper客戶端的依賴項。例如,可以使用Apache Curator作為ZooKeeper客戶端庫: 二.創(chuàng)建ZooKeeper連接:在應(yīng)用程序的配置文件中,配置ZooKeeper服務(wù)器的連接信息。例如,在application.properties文件中添加以下配置: 三.創(chuàng)建分布式鎖:使用ZooKee

    2024年02月13日
    瀏覽(23)
  • 實現(xiàn)分布式鎖:Zookeeper vs Redis

    目錄 引言 1. Zookeeper分布式鎖 1.1特點和優(yōu)勢: 強一致性 順序節(jié)點 Watch機制 1.2 Zookeeper分布式鎖代碼示例 2. Redis分布式鎖 2.1特點和優(yōu)勢: 簡單高效 可續(xù)租性 靈活性 2.2Redis分布式鎖代碼示例 3.對比和選擇 3.1??一致性要求 3.2??適用場景 3.3 性能和復(fù)雜度 結(jié)論 在分布式系統(tǒng)中,

    2024年01月22日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包