Redis實(shí)戰(zhàn)14-分布式鎖基本原理和不同實(shí)現(xiàn)方式對(duì)比
在上一篇文章(Redis實(shí)戰(zhàn)13-集群下線程并發(fā)安全問題)中,我們知道了,當(dāng)在集群環(huán)境下,synchronized關(guān)鍵字實(shí)現(xiàn)的JVM級(jí)別鎖會(huì)失效的。那么怎么解決這個(gè)問題呢?我們可以使用分布式鎖來解決。本文咱們就來介紹分布式鎖基本原理以及不同實(shí)現(xiàn)方式對(duì)比。
我們先來回顧,JVM級(jí)別鎖的時(shí)序圖。如下圖:

在集群下,不同jvm,就有多個(gè)鎖監(jiān)視器。那么,使用分布式鎖應(yīng)該是什么樣的?我們可不可以把鎖監(jiān)視器提出來,放到一個(gè)三方組件中,集群中所以的JVM進(jìn)程都可以共享訪問到這個(gè)公共的鎖監(jiān)視器呢?如下圖:

上圖就是分布式鎖的示意圖。那么什么是分布式鎖呢?
先來個(gè)小福利:【凱哥優(yōu)惠淘】
凱哥自己開發(fā)的,領(lǐng)取外賣、打車、咖啡、買菜、各大電商的優(yōu)惠券的公¥眾¥號(hào)。如下圖:

什么是分布式鎖?
分布式鎖需要滿足分布式系統(tǒng)或者集群模式下多個(gè)進(jìn)程可見并且互斥的鎖。
分布式鎖應(yīng)該滿足什么樣的條件呢?
可見性
多個(gè)線程都能看到相同的結(jié)果,
注意:這個(gè)地方說的可見性并不是我們并發(fā)編程中指的內(nèi)存的可見性。只是說多個(gè)進(jìn)程之間都能夠感知到變化的意思。
互斥
互斥是分布式鎖的最基本的條件,是的程序串行執(zhí)行
高可用
程序不容易崩潰,時(shí)時(shí)刻刻都保證較高的可用性
高性能
由于加鎖本身就是讓性能降低,所以對(duì)于分布式鎖本身需要有較高的加鎖性能和釋放鎖的性能
安全性
安全也是我們程序中必不可少的一個(gè)要素

常見的分布式鎖有三種
Mysql實(shí)現(xiàn)分布式鎖
mysql本身就帶有鎖機(jī)制,但是由于mysql性能本身一般,所以采用分布式鎖的情況下,起始使用MySQL作為分布式鎖比較少見;
Redis實(shí)現(xiàn)分布式鎖
redis作為分布式鎖是非常常見的一種使用方式,現(xiàn)在企業(yè)級(jí)開發(fā)中基本都是使用Redis或者zookeeper作為分布式鎖。Redis實(shí)現(xiàn)分布式鎖,利用的是setnx這個(gè)方法,如果插入key成功,則表示或得到了鎖,如果有人插入成功,其他人插入失敗則標(biāo)識(shí)無法獲取到鎖,利用這套邏輯來實(shí)現(xiàn)分布式鎖的。
Zookeeper實(shí)現(xiàn)分布式鎖
zookeeper也是企業(yè)級(jí)開發(fā)中比較好的一個(gè)實(shí)現(xiàn)分布式鎖的方案。主要使用到了臨時(shí)有序節(jié)點(diǎn)和watch機(jī)制來實(shí)現(xiàn)的。本系列教程主要講解Redis的,所以這里就不過多的闡述了。
我們來看看三種實(shí)現(xiàn)方式比較
我們從不同維度,對(duì)三種實(shí)現(xiàn)方式做了對(duì)比。如下圖:

下節(jié)預(yù)告:基于Redis實(shí)現(xiàn)分布式鎖實(shí)現(xiàn)思路.
凱哥推薦Redis實(shí)現(xiàn)分布式鎖系列文章:
《Redis實(shí)戰(zhàn)11-實(shí)現(xiàn)優(yōu)惠券秒殺下單》
《Redis實(shí)戰(zhàn)12-優(yōu)惠券實(shí)現(xiàn)一人一單功能》
《Redis實(shí)戰(zhàn)13-集群下線程并發(fā)安全問題》
《Redis實(shí)戰(zhàn)14-分布式鎖基本原理和不同實(shí)現(xiàn)方式對(duì)比》
或者到凱哥個(gè)人博客(聰明的你,從結(jié)束語中應(yīng)該能知道地址)查看Redis系列教程
結(jié)束語
大家好,我是凱哥Java(kaigejava),樂于分享技術(shù)文章,歡迎大家關(guān)注“凱哥Java”,及時(shí)了解更多。讓我們一起學(xué)Java。也歡迎大家有事沒事就來和凱哥聊聊~~~
