日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
面試問(wèn)了分布式鎖,你會(huì)答嗎?

哈嘍,大家好,我是指北君。

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的同德網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

分布式鎖在很多面試中都會(huì)提及,那么我們到底要不要了解呢?

1. 前言

分布式應(yīng)用中,有時(shí)我們需要一個(gè)方法在同一時(shí)間只能被一個(gè)線程執(zhí)行。此時(shí)我們有可能會(huì)使用到分布式鎖。

分布式鎖需要具備以下特征:

  • 互斥性同一時(shí)刻鎖只能被一個(gè)線程持有。
  • 超時(shí)釋放超時(shí)釋放主要是用來(lái)避免死鎖,防止不必要的線程等待和資源浪費(fèi)
  • 可重入性一個(gè)線程在持有鎖的情況下,可以再次請(qǐng)求加鎖
  • 高性能,高可用加鎖釋放鎖的操作盡量使用更少的資源,提高性能。同時(shí)也要保證高可用,防止分布式鎖意外失效

目前比較多的分布式鎖有下面的方案:

  • 基于數(shù)據(jù)庫(kù)實(shí)現(xiàn)分布式鎖
  • 基于緩存(redis, Hazelcast)等實(shí)現(xiàn)分布式鎖
  • 基于Zookeeper實(shí)現(xiàn)分布式鎖

2. 數(shù)據(jù)庫(kù)分布式鎖

2.1基于表記錄的分布式鎖

在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)鎖表,并且在需要的字段上創(chuàng)建唯一索引,使用鎖的時(shí)候就插入數(shù)據(jù),插入成功則獲得鎖,執(zhí)行結(jié)束后,就刪除數(shù)據(jù)。也可以加上version控制,使之成為樂(lè)觀鎖。

  • 獲取鎖:成功插入數(shù)據(jù)
  • 執(zhí)行業(yè)務(wù)邏輯
  • 釋放鎖:刪除數(shù)據(jù)

2.2基于數(shù)據(jù)庫(kù)行鎖的分布式鎖

使用select * For update來(lái)獲取數(shù)據(jù)庫(kù)數(shù)據(jù)鎖, where之后的條件加入唯一索引,則表示使用了行鎖。其分布式鎖使用順序如下。

  • 獲取鎖:SELECT * FROM database_lock WHERE id = 1 FOR UPDATE;。
  • 執(zhí)行業(yè)務(wù)邏輯。
  • 釋放鎖:COMMIT。

3.Zookeeper分布式鎖

Zookeepe可以實(shí)現(xiàn)分布式鎖主要是因?yàn)槎鄠€(gè)線程去Zookpeeper中創(chuàng)建同一個(gè)節(jié)點(diǎn)時(shí),只有一個(gè)線程可以創(chuàng)建成功。

Zookeeper中有臨時(shí)節(jié)點(diǎn),持久化節(jié)點(diǎn)。其中臨時(shí)節(jié)點(diǎn)在服務(wù)端session失效后,節(jié)點(diǎn)就會(huì)被刪除。相對(duì)而言,持久化節(jié)點(diǎn)在服務(wù)端session失效后,也不會(huì)被刪除,而是需要客戶端主動(dòng)刪除。

在上述類型系節(jié)點(diǎn)之后增加一個(gè)數(shù)字后綴,即路徑+數(shù)字后綴,這樣可以保證其唯一性和有序性。

其分布式鎖實(shí)現(xiàn)原理如下:

  • 創(chuàng)建一個(gè)lock目錄給分布式鎖使用
  • 某個(gè)線程想要獲取鎖就在此目錄下創(chuàng)建臨時(shí)順序節(jié)點(diǎn)
  • 獲取此目錄下的所有子節(jié)點(diǎn),然后查找比自己序號(hào)小的節(jié)點(diǎn),如果不存在,則當(dāng)前線程創(chuàng)建的節(jié)點(diǎn)是最小節(jié)點(diǎn),此時(shí)獲得鎖。
  • 其他線程想要獲取鎖,同樣是創(chuàng)建臨時(shí)有序節(jié)點(diǎn),如果是最小序號(hào)節(jié)點(diǎn)則獲得鎖,否則監(jiān)聽比自己小的次小節(jié)點(diǎn)。
  • 持有分布式鎖的線程操作完成之后,刪除自己的臨時(shí)節(jié)點(diǎn),次大節(jié)點(diǎn)監(jiān)聽到變更事件之后,判斷自己是最小序號(hào)節(jié)點(diǎn)的話,則獲得鎖。

Zookeeper實(shí)現(xiàn)分布式鎖具有高可用,可重入,阻塞等特點(diǎn),由于臨時(shí)節(jié)點(diǎn)在客戶端斷開的時(shí)候就會(huì)被自動(dòng)刪除,所以不用擔(dān)心死鎖問(wèn)題。但是頻繁刪除和創(chuàng)建節(jié)點(diǎn),性能上會(huì)比Redis分布式鎖低。

4 Redis分布式鎖

4.1 SETNX

setnx命令只會(huì)在key不存在的情況下將key設(shè)置為value值, 其中key和 value值均可以設(shè)置成和業(yè)務(wù)相關(guān)的的命名。但是不滿足超時(shí)釋放的要求。

如果使用expire設(shè)置過(guò)期時(shí)間,也有可能在setnx成功后,由于各種原因,expire沒(méi)有執(zhí)行成功,從而導(dǎo)致鎖不能超時(shí)釋放。

4.2 SETNX 擴(kuò)展命令

set key value [EX seconds] [PX milliseconds] [NX|XX]
#EX 設(shè)置過(guò)期時(shí)間,單位為秒 set lock VALUE EX 10
#PX 設(shè)置過(guò)期時(shí)間,單位為毫秒 set lock VALUE PX 10000
#NX key不存在時(shí)才設(shè)置key的值 set lock VALUE EX 10 NX
#XX key存在時(shí)才設(shè)置key SET lock VALUE EX 10 XX

set 擴(kuò)展命令可以完全取代 SETNX, SETEX, PSETEX 等功能。

可以使用set擴(kuò)展功能完成設(shè)置過(guò)期時(shí)間, 并且是原子操作。

上述分布式鎖也有一些問(wèn)題:

  • 如果線程獲取鎖之后,執(zhí)行時(shí)間過(guò)長(zhǎng),鎖提前釋放。
  • 如果線程A未執(zhí)行完操作,鎖超時(shí)釋放,此時(shí)線程B又獲取了鎖。線程B持有鎖,但是A線程有可能執(zhí)行DEL操作釋放鎖。

需要避免在長(zhǎng)時(shí)間執(zhí)行的任務(wù)中使用上述分布式鎖,而且未按時(shí)執(zhí)行完的線程不影響其最終結(jié)果。另外可以在鎖的value設(shè)置一些唯一值,刪除key之前驗(yàn)證是否持有鎖。并且驗(yàn)證和刪除需要使用Lua腳本保證其刪除操作的原子性。

上述分布式鎖還需要解決一個(gè)可重入性的問(wèn)題。

4.3 Redisson 分布式鎖

Redisson是基于Redis的Java內(nèi)存數(shù)據(jù)網(wǎng)格,充分利用了Redis鍵值數(shù)據(jù)庫(kù)提供的一系列優(yōu)勢(shì)。同時(shí)提供功能豐富的分布式鎖。

Resisson內(nèi)部會(huì)有一個(gè)監(jiān)控鎖的守護(hù)線程,在redisson實(shí)例被關(guān)閉前,不斷延長(zhǎng)鎖的有效期。并且可以自定義超時(shí)檢查時(shí)間間隔,同時(shí)還可以指定加鎖時(shí)間。另外還支持公平鎖(Fair Lock),聯(lián)鎖(MultiLock),紅鎖(RedLock),讀寫鎖(ReadWriteLock)以及RSemaphore和RCountDownLatch等類似Java提供的各種多線程工具等。

其中RedLock是基于多個(gè)Redis集群關(guān)聯(lián)的鎖,可以大大提高鎖的可用性及安全性。

關(guān)于Redisson,我們后續(xù)的文章會(huì)繼續(xù)講到,盡請(qǐng)期待!

分布式應(yīng)用中,有時(shí)我們需要一個(gè)方法在同一時(shí)間只能被一個(gè)線程執(zhí)行。此時(shí)我們有可能會(huì)使用到分布式鎖。?


文章名稱:面試問(wèn)了分布式鎖,你會(huì)答嗎?
網(wǎng)站鏈接:http://www.5511xx.com/article/copsjeo.html