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

分布式鎖的產(chǎn)生以及使用

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

日常開發(fā)中,針對一些需要鎖定資源的操作,例如商城的訂單超賣問題、訂單重復(fù)提交問題等。

都是為了解決在資源有限的情況限制客戶端的訪問,對應(yīng)的是限流。

單節(jié)點(diǎn)鎖問題

目前針對這種鎖資源的情況采取的往往是互斥鎖,例如 java 里的 synchronized 鎖以及?ReentrantLock,其中?synchronized 的加鎖操作在 jvm 層面實(shí)現(xiàn),會有一個鎖升級(偏向鎖、輕量級鎖、重量級鎖)的問題,ReentrantLock 需要手寫代碼實(shí)現(xiàn),底層是 AQS。但是 java 層面的鎖有一個問題,就是只能在一個進(jìn)程中使用,如果跨進(jìn)程就無能為力了,例如應(yīng)用的集群部署,客戶端請求過來后通過負(fù)載均衡策略轉(zhuǎn)發(fā)到對應(yīng)的實(shí)例上。

分布式鎖

鑒于以上單節(jié)點(diǎn)鎖的問題,就需要通過一個中間介質(zhì)來實(shí)現(xiàn)針對需要訪問的資源進(jìn)行一個資源加鎖和釋放操作的問題,目前有如下方式

數(shù)據(jù)庫

將需要訪問的數(shù)據(jù)可以放到數(shù)據(jù)庫的表中,一般存儲的是確保唯一性的業(yè)務(wù)主鍵,在訪問資源時可將業(yè)務(wù)主鍵插入到表中,每次訪問資源前先查詢數(shù)據(jù)庫判斷數(shù)據(jù)是否存在,如果存在表明資源在被訪問,否則就正常處理。

zookeeper

https://zookeeper.apache.org/doc/r3.9.1/recipes.html#sc_recipes_Locks

通過臨時順序節(jié)點(diǎn)(EPHEMERAL_SEQUENTIAL )來實(shí)現(xiàn),這種類型的節(jié)點(diǎn)的好處是會話級別,如果會話結(jié)束節(jié)點(diǎn)會刪除掉。

官方提供的是 curator 組件庫,在項(xiàng)目的 pom.xml 中引入如下依賴

		<dependency>
			<groupId>org.apache.curator</groupId>
			<artifactId>curator-recipes</artifactId>
			<version>5.5.0</version>
		</dependency>

https://curator.apache.org/docs/getting-started#distributed-lock

內(nèi)部提供了一個分布式鎖接口?InterProcessLock,通過對應(yīng)的實(shí)現(xiàn)類?InterProcessMutex 進(jìn)行加鎖和釋放鎖操作。

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessLock;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;

import java.util.concurrent.TimeUnit;

public class DistributedLock {

    public static void main(String[] args) throws InterruptedException {

        RetryPolicy retryPolicy = new ExponentialBackoffRetry(10000, 3);

        for (int i = 1; i <= 1; i++) {
            new Thread(() -> {
                try (CuratorFramework client = CuratorFrameworkFactory.newClient(Constants.CONNECTION_URL, retryPolicy);){
                    client.start();
                    InterProcessLock lock1 = new InterProcessMutex(client, "/dlock");
                    try {
                        lock1.acquire(5, TimeUnit.SECONDS);
                        System.out.println("lock1獲取");
                        TimeUnit.SECONDS.sleep(5);
                        lock1.release();
                        System.out.println("lock1釋放");
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }
                }
            }).start();

        }
    }
}

鎖的組成如下

/父節(jié)點(diǎn)/_c_+UUID+-lock-+10位數(shù)(從0開始自增,不足10位用0補(bǔ)足)

如果在執(zhí)行過程中進(jìn)行了多次加鎖,具體如下

/dlock/_c_0d4db7a9-5c21-4a57-9904-e42cd970d774-lock-0000000000
/dlock/_c_d3588ec1-981a-41aa-a420-89f7949f94d6-lock-0000000001

這樣就會有一個問題,前面的前綴?PROTECTED_PREFIX 和 UUID 會對節(jié)點(diǎn)產(chǎn)生干擾。

分布式鎖的產(chǎn)生以及使用,分布式,redis,分布式,zookeeper,數(shù)據(jù)庫,redis

https://github.com/apache/curator/blob/apache-curator-5.5.0/curator-framework/src/main/java/org/apache/curator/framework/imps/ProtectedUtils.java#L65

可以將?ProtectedUtils 整個類復(fù)制一遍在項(xiàng)目中,將?getProtectedPrefix() 的內(nèi)容進(jìn)行修改,如下

修改前

public static String getProtectedPrefix(final String protectedId)
{
	return PROTECTED_PREFIX + protectedId + PROTECTED_SEPARATOR;
}

修改后

public static String getProtectedPrefix(final String protectedId)
{
	return protectedId;
}

這樣生成的節(jié)點(diǎn)格式為

/父節(jié)點(diǎn)/lock-+10位數(shù)(從0開始自增,不足10位用0補(bǔ)足)

最終生成的節(jié)點(diǎn)如下

/dlock/lock-0000000000

其中對應(yīng)的節(jié)點(diǎn)值為當(dāng)前請求的 ip

[zk: localhost:2181(CONNECTED) 2] get /dlock/lock-0000000000
192.168.106.109

如果有多個客戶端針對同一個節(jié)點(diǎn)進(jìn)行加鎖請求,會按序創(chuàng)建多個節(jié)點(diǎn),但是持有鎖的只是最小的節(jié)點(diǎn),后面的節(jié)點(diǎn)會向獲取鎖的節(jié)點(diǎn)注冊?Watcher 來監(jiān)聽持有鎖的節(jié)點(diǎn)是否存在。

redis

作為一個在內(nèi)存層次的數(shù)據(jù)庫,用處多多,其中可以用于分布式鎖。

redis 提供了 lua 腳本支持,lua 腳本可以做到將操作進(jìn)行打包,確保整個操作的原子性。其中分布式鎖就用到了 lua 腳本。

redis 官方介紹

https://redis.io/docs/manual/patterns/distributed-locks/

該鎖被命名為?Redlock,在不同的語言中有對應(yīng)的實(shí)現(xiàn),在 java 中對應(yīng)的是?redisson。

在項(xiàng)目的 pom.xml 中引入如下依賴

<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>3.26.0</version>
</dependency>  

github 項(xiàng)目鏈接

https://github.com/redisson/redisson

與 spring boot 整合

https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter#spring-boot-starter

區(qū)別

分布式鎖建立在共享介質(zhì)上,所以上面的三種方式都需要借助于其他組件來實(shí)現(xiàn)。

數(shù)據(jù)庫層面不適合做高并發(fā)處理。

redis 依賴于全局時間,需要考慮到加鎖時間的問題。

zookeeper 建立在創(chuàng)建節(jié)點(diǎn)的基礎(chǔ)上,屬于重操作,相對于 redis 內(nèi)存操作慢一些。

由于?zookeeper 使用了 zab 協(xié)議,針對寫請求會轉(zhuǎn)發(fā)到領(lǐng)導(dǎo)者,如果領(lǐng)導(dǎo)者節(jié)點(diǎn)宕機(jī),會從跟隨者節(jié)點(diǎn)中選舉出數(shù)據(jù)最完整的節(jié)點(diǎn)晉升為領(lǐng)導(dǎo)者,不會出現(xiàn)類似 redis 異步同步數(shù)據(jù)丟失的問題。

對于一些并發(fā)請求大的應(yīng)用,使用 zookeeper 可能出現(xiàn)鎖獲取失敗的情況,使用 redis 集群不會因?yàn)?,因?yàn)?redis 的單線程高并發(fā)處理一般情況下難以達(dá)到,一般瓶頸在網(wǎng)卡帶寬上。

之前自己寫的文章

https://blog.csdn.net/zlpzlpzyd/article/details/132716450

參考鏈接

https://www.jianshu.com/p/31335efec309

https://www.cnblogs.com/xuwc/p/14019932.html

https://juejin.cn/post/6844903729406148622

https://www.cnblogs.com/crazymakercircle/p/14504520.html

https://blog.csdn.net/qq_26709459/article/details/112770526

https://zhuanlan.zhihu.com/p/639756647

https://zhuanlan.zhihu.com/p/383512946

https://www.cnblogs.com/zwj-199306231519/articles/17411947.html

https://baijiahao.baidu.com/s?id=1784900642230670850文章來源地址http://www.zghlxwxcb.cn/news/detail-810790.html

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

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

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

相關(guān)文章

  • Zookeeper分布式鎖的概念及原理

    Zookeeper分布式鎖的概念及原理

    分布式鎖的概念圖如下:一種演變過程。 在我們進(jìn)行單機(jī)應(yīng)用程序開發(fā)時,往往會涉及到并發(fā)同步的問題,一般都會采用synchronized或者Lock鎖的方式來解決多線程間的代碼同步問題,這些多線程都是運(yùn)行在同一個JVM之下,是沒有任何問題的。 場景:當(dāng)有一個請求數(shù)據(jù)的線程進(jìn)

    2024年02月12日
    瀏覽(84)
  • ZooKeeper分布式鎖的實(shí)現(xiàn)與應(yīng)用

    ZooKeeper是一種分布式應(yīng)用程序協(xié)調(diào)服務(wù),它可以管理大規(guī)模的集群,并提供可靠的、有序的、高效的數(shù)據(jù)通信。其中,ZooKeeper提供的分布式鎖是一種常見的分布式鎖實(shí)現(xiàn),本文將對其進(jìn)行詳細(xì)介紹。 在分布式系統(tǒng)中,多個進(jìn)程或節(jié)點(diǎn)可能需要同時訪問共享資源。為了確保數(shù)據(jù)

    2024年02月02日
    瀏覽(21)
  • 【Redis】Redis分布式鎖的10個坑

    【Redis】Redis分布式鎖的10個坑

    日常開發(fā)中,經(jīng)常會碰到秒殺搶購等業(yè)務(wù)。為了避免并發(fā)請求造成的庫存超賣等問題,我們一般會用到Redis分布式鎖。但是使用Redis分布式鎖,很容易踩坑哦~ 本文將給大家分析闡述,Redis分布式鎖的10個坑~ 一說到實(shí)現(xiàn)Redis的分布式鎖,很多小伙伴馬上就會想到setnx+ expire命令。

    2024年02月05日
    瀏覽(26)
  • 分布式鎖的實(shí)現(xiàn)(redis)

    1、單機(jī)鎖 考慮在并發(fā)場景并且存在競態(tài)的狀況下,我們就要實(shí)現(xiàn)同步機(jī)制了,最簡單的同步機(jī)制就是加鎖。 加鎖可以幫我們鎖住資源,如內(nèi)存中的變量,或者鎖住臨界區(qū)(線程中的一段代碼),使得同一個時刻只有一個線程能訪問某一個區(qū)域。 如果是單實(shí)例(單進(jìn)程部署),那

    2024年02月12日
    瀏覽(20)
  • redis分布式鎖的9種實(shí)現(xiàn)方式

    redis分布式鎖的9種實(shí)現(xiàn)方式

    1.為什么要用分布式鎖 如果是單機(jī)情況下(單JVM),線程之間共享內(nèi)存,只要使用線程鎖就可以解決并發(fā)問題。但如果是分布式情況下(多JVM),線程A和線程B很可能不是在同一JVM中,這樣線程鎖就無法起到作用了,這時候就要用到分布式鎖來解決。分布式鎖其實(shí)就是,控制

    2024年02月15日
    瀏覽(26)
  • Redis——》Redis的部署方式對分布式鎖的影響

    Redis——》Redis的部署方式對分布式鎖的影響

    推薦鏈接: ????總結(jié)——》【Java】 ????總結(jié)——》【Mysql】 ????總結(jié)——》【Redis】 ????總結(jié)——》【Kafka】 ????總結(jié)——》【Spring】 ????總結(jié)——》【SpringBoot】 ????總結(jié)——》【MyBatis、MyBatis-Plus】 ????總結(jié)——》【Linux】 ????總結(jié)——》【MongoDB】 ???

    2024年02月10日
    瀏覽(24)
  • 分別使用Redis、MySQL、ZooKeeper構(gòu)建分布式鎖

    本文使用Java構(gòu)建三種中間件的分布式鎖,下面介紹下三種分布式鎖的優(yōu)缺點(diǎn), 使用MySQL構(gòu)建分布式鎖 ,因?yàn)閿?shù)據(jù)庫數(shù)據(jù)存儲在磁盤中,所以IO速率相對較慢,因此構(gòu)建出來的分布式鎖不適合用在高并發(fā)場景,對于一些對并發(fā)要求不高的系統(tǒng)中可以使用,進(jìn)一步提高系統(tǒng)的安全

    2024年02月06日
    瀏覽(15)
  • 深入理解PHP+Redis實(shí)現(xiàn)分布式鎖的相關(guān)問題

    PHP使用分布式鎖,受語言本身的限制,有一些局限性。 通俗理解單機(jī)鎖問題:自家的鎖鎖自家的門,只能保證自家的事,管不了別人家不鎖門引發(fā)的問題,于是有了分布式鎖。 分布式鎖概念:是針對多個節(jié)點(diǎn)的鎖。避免出現(xiàn)數(shù)據(jù)不一致或者并發(fā)沖突的問題,讓每個節(jié)點(diǎn)確保

    2024年03月23日
    瀏覽(28)
  • 【征服redis15】分布式鎖的功能與整體設(shè)計方案

    【征服redis15】分布式鎖的功能與整體設(shè)計方案

    目錄 ?1. 分布式鎖的概念 2.基于數(shù)據(jù)庫做分布式鎖 2.1 基于表主鍵唯一做分布式鎖 2.2 基于表字段版本號做分布式鎖 2.3 基于數(shù)據(jù)庫排他鎖做分布式鎖 3.使用Redis做分布式鎖 3.1 redis實(shí)現(xiàn)分布式鎖的基本原理 3.2 問題一:增加超時機(jī)制,防止長期持有的情況 3.3 問題2:重入的問題

    2024年01月22日
    瀏覽(23)
  • 高并發(fā)緩存問題分析以及分布式鎖的實(shí)現(xiàn)

    高并發(fā)緩存問題分析以及分布式鎖的實(shí)現(xiàn)

    在高并發(fā)的環(huán)境下,比如淘寶,京東不定時的促銷活動,大量的用戶訪問會導(dǎo)致數(shù)據(jù)庫的性能下降,進(jìn)而有可能數(shù)據(jù)庫宕機(jī)從而不能產(chǎn)生正常的服務(wù),一般一個系統(tǒng)最大的性能瓶頸,就是數(shù)據(jù)庫的io操作,如果發(fā)生大量的io那么他的問題也會隨之而來。從數(shù)據(jù)庫入手也是調(diào)優(yōu)性價比最高

    2024年01月19日
    瀏覽(34)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包