一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分布式鎖的基本原理和案例實(shí)現(xiàn)

如意 ? 來(lái)源:百家號(hào) ? 作者:小碼農(nóng)談IT ? 2020-07-01 14:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前面我們有聊過(guò)樂(lè)觀鎖和悲觀鎖的實(shí)現(xiàn),均是對(duì)于單體架構(gòu)的場(chǎng)景下的實(shí)現(xiàn)。那么現(xiàn)在我們來(lái)總結(jié)看下分布式情況下如何實(shí)現(xiàn)鎖機(jī)制。

常見(jiàn)場(chǎng)景

我們來(lái)看下一個(gè)場(chǎng)景,假設(shè)我現(xiàn)在在分布式系統(tǒng)下要做一個(gè)業(yè)務(wù)邏輯的消費(fèi)動(dòng)作,我如何保證我的消費(fèi)動(dòng)作只被消費(fèi)一次不重復(fù)消費(fèi)?有的同學(xué)第一時(shí)間就想到了MQ,諸如Zookeeper。我們今天暫不談MQ,那其實(shí)核心還是代碼執(zhí)行的鎖機(jī)制問(wèn)題。

我們?cè)賮?lái)看一個(gè)場(chǎng)景,我們有個(gè)接口需要經(jīng)常查數(shù)據(jù)庫(kù)DB數(shù)據(jù),如果場(chǎng)景允許我們經(jīng)常會(huì)對(duì)其加一層緩存,并設(shè)定過(guò)期時(shí)間。假設(shè)在某一瞬間,緩存過(guò)期,但此時(shí)并發(fā)量又很大,會(huì)有大量的請(qǐng)求穿透去數(shù)據(jù)庫(kù)請(qǐng)求數(shù)據(jù),造成緩存雪崩效應(yīng)。于是,我們就可以考慮加鎖機(jī)制,只讓一個(gè)請(qǐng)求去執(zhí)行查詢DB更新緩存的操作。

基本原理

回顧下我們之前聊到鎖的原理,分布式鎖也是一樣的,要實(shí)現(xiàn)它必須滿足:

互斥:任何時(shí)刻只能有一個(gè)客戶端對(duì)其加鎖;

避免死鎖:要充分考慮某客戶端在持有鎖的期間崩潰,也不能導(dǎo)致后續(xù)其他客戶端不能加鎖;

誰(shuí)加鎖誰(shuí)解鎖:加鎖和解鎖必須是同一個(gè)客戶端,否則容易出現(xiàn)A客戶端把B客戶端的鎖給解了,導(dǎo)致鎖機(jī)制失效。

示例實(shí)踐

我們僅以Redis實(shí)現(xiàn)分布式鎖為例來(lái)說(shuō)明分布式鎖的實(shí)現(xiàn)。以單機(jī)單機(jī)部署Redis的情況為例,如果有分布式Redis集群部署的情況,可以參考Redlock算法的實(shí)現(xiàn)。下面我們進(jìn)入Redis+Lua實(shí)現(xiàn)分布式鎖的實(shí)踐。

我們來(lái)看示例代碼。

加鎖

分布式鎖的基本原理和案例實(shí)現(xiàn)

注意到代碼的每個(gè)細(xì)節(jié)了么?都是至關(guān)重要的。上面的set是封裝過(guò)的,那我們來(lái)簡(jiǎn)單說(shuō)明一下這個(gè)方法吧,該方法分別對(duì)應(yīng)了上面的鎖需要滿足的條件。比如,NX操作保證了鎖的互斥,設(shè)置過(guò)期時(shí)間避免了死鎖,唯一請(qǐng)求ID用來(lái)標(biāo)注客戶端,在解鎖的時(shí)候可以用來(lái)校驗(yàn)是不是同一個(gè)客戶端自己的鎖。

解鎖

解鎖這個(gè)動(dòng)作就有趣了,看似簡(jiǎn)單卻暗藏玄機(jī),也是很重要的環(huán)節(jié)。因?yàn)榻怄i存在一個(gè)判斷是都本客戶端的鎖的操作,之后才執(zhí)行解鎖。而這個(gè)if判斷在高并發(fā)的情況下我們不得不考慮操作的原子性,這其實(shí)和PHP等其他語(yǔ)言代碼考慮高并發(fā)的原理是大相徑庭(有興趣的看官也可以思考下,為什么有判斷就要保證原子性呢,有哪些可能出現(xiàn)問(wèn)題的場(chǎng)景)。那我們?nèi)绻WC操作的原子性呢?第一反應(yīng)是想到事務(wù)?我們這里借助Lua腳本來(lái)保證原子性,Redis的eval命令執(zhí)行Lua腳本保證原子性。

我們來(lái)看下示例代碼

分布式鎖的基本原理和案例實(shí)現(xiàn)

我們同樣來(lái)說(shuō)明下面的解鎖代碼。其實(shí)很簡(jiǎn)單,就是執(zhí)行了一個(gè)Lua腳本,這個(gè)腳本實(shí)現(xiàn)了或者當(dāng)前鎖的值,即唯一請(qǐng)求ID值,判斷是否同一個(gè)客戶端的請(qǐng)求ID,如果是,則執(zhí)行Redis的del操作。

好了,關(guān)于Redis實(shí)現(xiàn)分布式的鎖例子就到這里了,這里只是簡(jiǎn)單的示例便于理解,實(shí)際生產(chǎn)將需要考慮更多的場(chǎng)景和因素,比如集群,Zookeeper方式實(shí)現(xiàn),時(shí)間和能力有限,這里就不展開(kāi)贅述。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 死鎖
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    8197
  • 分布式
    +關(guān)注

    關(guān)注

    1

    文章

    993

    瀏覽量

    75299
  • 程序互斥
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    6216
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Redis 分布式的正確實(shí)現(xiàn)方式

    分布式一般有三種實(shí)現(xiàn)方式:1. 數(shù)據(jù)庫(kù)樂(lè)觀;2. 基于Redis的分布式;3. 基于Zoo
    的頭像 發(fā)表于 05-31 14:19 ?3803次閱讀

    Java:Redis分布式的原理和案例

    要介紹分布式,首先要提到與分布式鎖相對(duì)應(yīng)的是線程、進(jìn)程。
    的頭像 發(fā)表于 07-01 11:49 ?4117次閱讀

    為什么需要分布式 基于Zookeeper安全嗎

    講清楚。導(dǎo)致很多讀者看了很多文章,依舊云里霧里。例如下面這些問(wèn)題,你能清晰地回答上來(lái)嗎? 基于 Redis 如何實(shí)現(xiàn)一個(gè)分布式? Redis 分布式
    的頭像 發(fā)表于 08-10 18:06 ?5810次閱讀

    Redis分布式有什么特性

    今天我們聊聊分布式。 1. 分布式是什么? 我們的手機(jī)有、車(chē)有、家門(mén)有
    的頭像 發(fā)表于 10-12 16:42 ?2549次閱讀

    分布式的設(shè)計(jì)與實(shí)現(xiàn)

    今天跟大家探討一下分布式的設(shè)計(jì)與實(shí)現(xiàn)。希望對(duì)大家有幫助,如果有不正確的地方,歡迎指出,一起學(xué)習(xí),一起進(jìn)步哈。
    的頭像 發(fā)表于 05-13 15:36 ?2149次閱讀

    深入理解redis分布式

    深入理解redis分布式 哈嘍,大家好,我是指北君。 本篇文件我們來(lái)介紹如何Redis實(shí)現(xiàn)分布式的演進(jìn)過(guò)程,以及為什么不能直接用Setn
    的頭像 發(fā)表于 10-08 14:13 ?1262次閱讀
    深入理解redis<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>

    Redis實(shí)現(xiàn)分布式的幾種方案

    本文將介紹什么是分布式,以及使用Redis實(shí)現(xiàn)分布式的幾種方案。 前言 了解分布式
    的頭像 發(fā)表于 10-11 15:19 ?903次閱讀

    什么是分布式 Redis的五種分布式方案

    本地加鎖的方式在分布式的場(chǎng)景下不適用,所以本文我們來(lái)探討下如何引入分布式解決本地的問(wèn)題。本篇所有代碼和業(yè)務(wù)基于我的開(kāi)源項(xiàng)目 PassJava。
    發(fā)表于 10-23 11:35 ?1706次閱讀
    什么是<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b> Redis的五種<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>方案

    tldb提供分布式使用方法

    前言:分布式分布式系統(tǒng)中一個(gè)極為重要的工具。目前有多種分布式的設(shè)計(jì)方案,比如借助 redis,mq,數(shù)據(jù)庫(kù),zookeeper 等第三
    的頭像 發(fā)表于 11-02 14:44 ?1225次閱讀
    tldb提供<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>使用方法

    redis分布式如何實(shí)現(xiàn)

    Redis分布式是一種基于Redis實(shí)現(xiàn)的機(jī)制,可以用于多個(gè)進(jìn)程或多臺(tái)服務(wù)器之間對(duì)共享資源的并發(fā)訪問(wèn)控制。在分布式系統(tǒng)中,由于多個(gè)進(jìn)程或多臺(tái)服務(wù)器同時(shí)訪問(wèn)共享資源,可能會(huì)發(fā)生數(shù)據(jù)競(jìng)爭(zhēng)
    的頭像 發(fā)表于 11-16 11:29 ?761次閱讀

    redis分布式死鎖處理方案

    引言: 隨著分布式系統(tǒng)的廣泛應(yīng)用,尤其是在大規(guī)模并發(fā)操作下,對(duì)并發(fā)控制的需求越來(lái)越高。Redis分布式作為一種常見(jiàn)的分布式
    的頭像 發(fā)表于 11-16 11:44 ?2257次閱讀

    redis分布式的應(yīng)用場(chǎng)景有哪些

    Redis分布式是一種基于Redis實(shí)現(xiàn)分布式機(jī)制,可以在分布式環(huán)境下確保資源的獨(dú)占性,避
    的頭像 發(fā)表于 12-04 11:21 ?1870次閱讀

    redis分布式三個(gè)方法

    的三種常見(jiàn)的分布式實(shí)現(xiàn)方法:基于SETNX命令的簡(jiǎn)單分布式、基于SET命令的帶過(guò)期時(shí)間的分布式
    的頭像 發(fā)表于 12-04 11:22 ?1726次閱讀

    如何實(shí)現(xiàn)Redis分布式

    機(jī)制,下面將詳細(xì)介紹如何實(shí)現(xiàn)Redis分布式。 一、引言 在分布式系統(tǒng)中,多個(gè)節(jié)點(diǎn)可能同時(shí)讀寫(xiě)同一共享資源。如果沒(méi)有實(shí)現(xiàn)互斥訪問(wèn)和同步機(jī)制
    的頭像 發(fā)表于 12-04 11:24 ?936次閱讀

    分布式的三種實(shí)現(xiàn)方式

    分布式的三種實(shí)現(xiàn)方式? 分布式是在分布式系統(tǒng)中用于實(shí)現(xiàn)
    的頭像 發(fā)表于 12-28 10:01 ?1241次閱讀