欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報激活碼778899分享:lua 【Redis】分布式鎖

柚子快報激活碼778899分享:lua 【Redis】分布式鎖

http://yzkb.51969.com/

經(jīng)過上節(jié)課的演示,可以發(fā)現(xiàn)在集群模式下synchronized鎖失效了,synchronized只能保證單個JVM內(nèi)部的多個線程之間的互斥,而沒有辦法讓我們集群下的多個JVM進程之間互斥,要想解決這個問題,我們必須使用分布式鎖。

文章目錄

一、基本原理二、實現(xiàn)方式對比

一、基本原理

分布式鎖:滿足分布式系統(tǒng)或集群模式下多進程可見并且互斥的鎖。

分布式鎖的核心思想就是讓大家都使用同一把鎖,只要大家使用的是同一把鎖,那么我們就能鎖住線程,不讓線程進行,讓程序串行執(zhí)行,這就是分布式鎖的核心思路

那么分布式鎖他應(yīng)該滿足一些什么樣的條件呢?

可見性:多個線程都能看到相同的結(jié)果,注意:這個地方說的可見性并不是并發(fā)編程中指的內(nèi)存可見性,只是說多個進程之間都能感知到變化的意思。例如redis。其實只要是JVM外部的基本上都可以做到多線程可見,用MySQL也可以,因此這個很容易做到。比較難的就是互斥。

互斥:即不管誰來訪問你只有1個人能拿到,其他人都是失敗。互斥是分布式鎖的最基本的條件,使得程序串行執(zhí)行

高可用:獲取鎖的時候都能是成功的,程序不易崩潰,時時刻刻都保證較高的可用性

高性能:由于加鎖(串行執(zhí)行)本身就讓性能降低,所有對于分布式鎖本身需要他就較高的加鎖性能和釋放鎖性能

安全性:安全也是程序中必不可少的一環(huán),即獲取鎖的時候需要考慮到一些異常的情況,例如獲取鎖的時候還沒有釋放,程序就掛了怎么辦?會不會產(chǎn)生死鎖?等問題

以上這五個是分布式鎖要滿足的基本的特性,除了這些以外,還有一些功能性的特征,你可以滿足也可以不滿足,例如是不是能滿足可重入性,你獲取鎖的時候是阻塞的還是非阻塞的,你是公平鎖還是非公平鎖?等等,這些都是功能上的一些特性,這里我們不作為重點去討論。

接下來我們討論在不同的分布式鎖實現(xiàn)方案中它是如何實現(xiàn)互斥的、有什么差異、它是如何保證高可用性的、高性能、以及它的安全性如何,這是我們重點要去對比的幾個點。

二、實現(xiàn)方式對比

常見的分布式鎖有三種

Mysql:MySQL數(shù)據(jù)庫或者其他的數(shù)據(jù)庫,都具備事務(wù)機制,那么當(dāng)事務(wù)執(zhí)行的時候,或者說我們在執(zhí)行寫操作的時候,MySQL就會自動給你分配一個互斥的鎖,這樣一來在多個事務(wù)之間就是互斥的,只有一個人能去執(zhí)行,因此我們完全就能接于這個原理來實現(xiàn)一把鎖。

我們可以在需要實現(xiàn)分布式鎖的業(yè)務(wù)的地方,在業(yè)務(wù)執(zhí)行前,先去MySQL中申請一個互斥鎖,然后去執(zhí)行我們的業(yè)務(wù)。當(dāng)業(yè)務(wù)執(zhí)行完后,我們?nèi)ヌ峤皇聞?wù),這樣一來鎖就釋放了。當(dāng)我們的業(yè)務(wù)拋了異常的時候,它會自動觸發(fā)回滾、鎖也就釋放了。

這樣一來互斥效果、鎖釋放就都很容易實現(xiàn)了。

mysql實現(xiàn)的方式就是利用MySQL本身的互斥鎖做。它的可用性依賴于MySQL本身的可用性,由于MySQL是支持主從模式的,因此可用性應(yīng)該說還是不錯的。但是由于mysql性能本身一般,所以采用分布式鎖的情況下,其實使用mysql作為分布式鎖比較少見。

安全性:一旦出現(xiàn)異常,這個鎖能不能及時釋放呢?其實是可以的,因為在MySQL中是利用事務(wù)機制獲取的鎖,但是一旦你系統(tǒng)崩潰了,其實連接斷開后鎖是會自動釋放的,數(shù)據(jù)也會回滾

Redis:redis作為分布式鎖是非常常見的一種使用方式,現(xiàn)在企業(yè)級開發(fā)中基本都使用redis或者zookeeper作為分布式鎖,利用setnx這個命令,如果插入key成功,則表示獲得到了鎖,如果有人插入成功,其他人插入失敗則表示無法獲得到鎖,利用這套邏輯來實現(xiàn)分布式鎖。

可用性:redis不僅僅支持主從,它還支持集群模式,所以它的可用性是可以得到保障的。

高性能:性能更不用講了,redis性能是遠遠好于MySQL的,因此它執(zhí)行分布式鎖的性能也是非常好的。

安全性:一旦出現(xiàn)異常,這個鎖能不能及時釋放呢?這個就必須了,因為我們利用setnx是設(shè)置了一個key到redis中,如果服務(wù)宕機了,將來沒有人去執(zhí)行刪除的動作,key一直在那里,鎖得不到釋放,這樣一來其他人也拿不到鎖,就產(chǎn)生類似于死鎖的效果的,就出現(xiàn)問題了。因此為了解決這個問題,我們再利用setnx獲取鎖的時候,必須想一個辦法,將來一旦出現(xiàn)故障,鎖也能釋放。這個辦法就是利用redis的key的過期機制。

不過這個鎖的釋放時間設(shè)置多長呢?,如果太長了,那這個鎖無效等待時間就會比較多;但如果設(shè)置太短了,萬一我的業(yè)務(wù)還沒執(zhí)行完呢?所以說這種方式做安全性的一個保證是可以做的,但是還需要去完善,具體怎么解決后面會講。

Zookeeper:zookeeper也是企業(yè)級開發(fā)中較好的一個實現(xiàn)分布式鎖的方案,它鎖的原理其實是利用了內(nèi)部的節(jié)點機制。

Zookeeper內(nèi)部它可以去創(chuàng)建這種數(shù)據(jù)節(jié)點的,而節(jié)點具備這種唯一性和有序性,另外還可以創(chuàng)建這種臨時節(jié)點。

所謂的唯一性就是:我們?nèi)?chuàng)建節(jié)點的時候節(jié)點不能重復(fù)。

有序性:每創(chuàng)建一個節(jié)點ip就是遞增的。

這里我們可以利用有序性來實現(xiàn)互斥,比如說我們現(xiàn)在有很多線程都從Zookeeper中創(chuàng)建節(jié)點,這樣一來每一個節(jié)點它的id是不是就是單調(diào)遞增的。如果我們約定id最小的那個它就算是獲取成功,這樣一來就實現(xiàn)互斥了,因為最小的只有一個。

當(dāng)然你也可以利用唯一性,比如大家都去創(chuàng)建節(jié)點,并且節(jié)點名稱大家都是一樣的,這樣一來是不是只有一個人成功,所以也可以。

但一般情況下我們都是利用可續(xù)行去實現(xiàn)這種互斥。

釋放鎖:你講節(jié)點刪除你就不是最小的了,此時另外一個人就變成最小的了。

可用性:Zookeeper本身也是支持集群的,因此它的可用性很好。

而性能上的話,Zookeeper集群強調(diào)的是強的一致性,而這種強的一致性就會導(dǎo)致它的主從之間做數(shù)據(jù)同步就會消耗一定的時間,所以它的性能相對來講要比redis差一些。

而安全型它做的很好,因為它創(chuàng)建的節(jié)點往往是臨時節(jié)點,這時候一旦出現(xiàn)故障,例如宕機了,斷開后它的節(jié)點就會自動釋放,所以鎖也就釋放了,所以這塊其實也不用考慮。

因此從安全性考慮,Zookeeper和MySQL它們兩個原理基本上類似,所以安全性是比較好的,比redis要好一些,redis只能利用超時機制來做。

但是從可用性和性能上來講,redis是非常好的。因此接下來我們就會帶著大家學(xué)一下,如何基于redis來去實現(xiàn)分布式鎖。

柚子快報激活碼778899分享:lua 【Redis】分布式鎖

http://yzkb.51969.com/

好文閱讀

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19465510.html

發(fā)布評論

您暫未設(shè)置收款碼

請在主題配置——文章設(shè)置里上傳

掃描二維碼手機訪問

文章目錄