Redis分布式鎖原理及性能優(yōu)化

一谁榜、什么是分布式鎖

在單體架構(gòu)中幅聘,系統(tǒng)只有一個,系統(tǒng)所用的內(nèi)存和進程也只有一個惰爬,多個線程可以共享同一份數(shù)據(jù)喊暖。這樣只要使用java提供的鎖機制就可以解決并發(fā)訪問帶來的問題惫企,但是分布式系統(tǒng)中撕瞧,系統(tǒng)是多個,并且所使用的內(nèi)存也是不同的狞尔,每個系統(tǒng)也都有獨立的進程丛版,這樣Java提供的鎖就沒辦法解決分布式系統(tǒng)中的并發(fā)訪問問題。因此就需要引入分布式鎖來解決分布式系統(tǒng)中共享資源訪問的問題偏序。

1.2 分布式鎖的特性

1.要保證同一時刻內(nèi)页畦,只有一個服務(wù)獲取到這個鎖
2.這把鎖要能重入,在某些業(yè)務(wù)下會出現(xiàn)同一把鎖的重入
3.具備鎖續(xù)命研儒,保證高并發(fā)下不會因鎖的時效問題引起數(shù)據(jù)錯誤
4.具有非阻塞式獲取鎖豫缨,在獲取鎖失敗后立刻返回

1.3 基于Redisson實現(xiàn)的分布式鎖

Redisson中分布式鎖的架構(gòu):
image

關(guān)于Redisson分布式鎖的使用:

private Integer setInfo(Long key){
    // 獲取分布式鎖
    RLock lock = redisson.getLock("Ext_Info:" + key);
    // 加鎖
    lock.lock();
    try{
        // 業(yè)務(wù)處理
        Product product = productDao.get(key);
        return 1;
    }catch (Exception e){
        e.printStackTrace();
    }finally {
        // 解鎖
        lock.unlock();
    }
    return  -1;
}

1.4 分布式鎖失效問題

當主從或集群機構(gòu)的主節(jié)點掛掉后,該節(jié)點存儲的分布式鎖信息可能會丟失端朵。而當從節(jié)點選舉成新節(jié)點后好芭,其它線程又可以對新的主節(jié)點進行添加分布式鎖信息,這就會引起并發(fā)安全問題冲呢。

為了解決這個問題舍败,就引入了redlock。
redlock的邏輯就是向多個節(jié)點寫入加鎖的信息敬拓,如果寫入成功邻薯,加代表加鎖成功。但是如果寫入的節(jié)點丟失了鎖的信息乘凸,仍然是會出現(xiàn)分布式鎖失效問題厕诡。
還有一點就是性能問題,我們使用redis就是為了它的高性能营勤,但是使用redlock后每次加鎖都要寫入多個節(jié)點灵嫌,這就會降低redis性能信柿,這樣還不如使用zookeeper。


image.png

二醒第、Redisson實現(xiàn)分布式鎖源碼剖析

加鎖的核心邏輯:
image

加鎖成功后的鎖續(xù)命邏輯:
image

其它線程加鎖失敗后的邏輯:
image

解鎖核心邏輯:
image

三渔嚷、分布式鎖的優(yōu)化

對于讀多寫少的業(yè)務(wù),可以使用readwirte鎖:

public Product update(Product product) {
    Product productResult = null;
    // 獲取分布式鎖
    RReadWriteLock readWriteLock = redisson.getReadWriteLock(LOCK_PRODUCT_UPDATE_PREFIX + product.getId());
    // 寫鎖
    RLock writeLock = readWriteLock.writeLock();
    // 加鎖
    writeLock.lock();
    try {
        productResult = productDao.update(product);
        // 設(shè)置過期時間
        redisUtil.set(productResult.getId(), JSON.toJSONString(productResult),
                genProductCacheTimeout(), TimeUnit.SECONDS);
    } finally {
        // 釋放鎖
        writeLock.unlock();
    }
    return productResult;
}

redisson實現(xiàn)的讀寫鎖稠曼,大體上和上面的分布式鎖邏輯相同形病,只是加了一個mode,用于區(qū)分是讀還是寫霞幅。對于讀讀而言漠吻,就等于是鎖的重入,不會阻塞司恳;對于讀寫途乃、寫寫操作,就會阻塞保證并發(fā)的安全扔傅。

四耍共、緩存問題

1、什么是緩存擊穿猎塞?

當同一時刻有大量的緩存失效试读,就會導(dǎo)致大量的請求打到數(shù)據(jù)庫,會造成數(shù)據(jù)庫壓力過大甚至宕機荠耽。
解決辦法:在給緩存數(shù)據(jù)設(shè)置過期時間時钩骇,增加一個隨機的擾動因子,避免讓大量的緩存數(shù)據(jù)都同一時刻失效铝量。

2倘屹、什么是緩存穿透?

緩存層和數(shù)據(jù)庫都沒有數(shù)據(jù)慢叨,每次請求都會落到數(shù)據(jù)庫纽匙,如果是高并發(fā)場景下,就會引起數(shù)據(jù)的壓力劇增插爹,甚至宕機哄辣。
解決辦法:
1、對于不存在的數(shù)據(jù)赠尾,可以在緩存層面設(shè)置對應(yīng)key的空值
2力穗、布隆過濾器,向布隆過濾器中添加key時气嫁,會先使用多個hash函數(shù)進行運算当窗,然后定位到布隆過濾器的數(shù)組中某個下標。當某個key查詢布隆過濾器數(shù)據(jù)時寸宵,會同樣使用多個hash函數(shù)進行運算崖面,然后得到數(shù)組中的下標位置元咙。

3、什么是緩存雪崩巫员?

緩存層的作用就是分擔數(shù)據(jù)庫層面的壓力庶香,如果緩存層宕機,大量的請求就直接打到數(shù)據(jù)庫简识,高并發(fā)下數(shù)據(jù)庫有可能宕機赶掖。
解決辦法:
1、確保緩存層的高可用七扰,比如搭建集群奢赂、主從架構(gòu)
2、在后端應(yīng)用上設(shè)置限流或服務(wù)降級

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颈走,一起剝皮案震驚了整個濱河市膳灶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌立由,老刑警劉巖轧钓,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拆吆,居然都是意外死亡聋迎,警方通過查閱死者的電腦和手機脂矫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門枣耀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人庭再,你說我怎么就攤上這事捞奕。” “怎么了拄轻?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵颅围,是天一觀的道長。 經(jīng)常有香客問我恨搓,道長院促,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任斧抱,我火速辦了婚禮常拓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辉浦。我一直安慰自己弄抬,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布宪郊。 她就那樣靜靜地躺著掂恕,像睡著了一般拖陆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懊亡,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天依啰,我揣著相機與錄音,去河邊找鬼店枣。 笑死孔飒,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的艰争。 我是一名探鬼主播坏瞄,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼甩卓!你這毒婦竟也來了鸠匀?” 一聲冷哼從身側(cè)響起逾柿,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎机错,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弱匪,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡青瀑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了萧诫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡帘饶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出及刻,到底是詐尸還是另有隱情镀裤,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布缴饭,位于F島的核電站暑劝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏铃岔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一毁习、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纺且,春花似錦、人聲如沸载碌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朗伶。三九已至步咪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猾漫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工悯周, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人禽翼。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像捐康,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子解总,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容