偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

又一個防緩存擊穿、穿透和雪崩的新項目開擼!支持高并發(fā),性能也是嘎嘎強!

數(shù)據(jù)庫 Redis
說到Redis,往往更多的場景是被用作系統(tǒng)的緩存,說到緩存,尤其是分布式緩存系統(tǒng),在實際高并發(fā)場景下,稍有不慎,就會造成緩存穿透、緩存擊穿和緩存雪崩的問題。

一、項目背景

記得在《【高并發(fā)】Redis如何助力高并發(fā)秒殺系統(tǒng)?看完這篇我徹底懂了??!》一文中,我們以高并發(fā)秒殺系統(tǒng)中扣減庫存的場景為例,說明了Redis是如何助力秒殺系統(tǒng)的。

那么,說到Redis,往往更多的場景是被用作系統(tǒng)的緩存,說到緩存,尤其是分布式緩存系統(tǒng),在實際高并發(fā)場景下,稍有不慎,就會造成緩存穿透、緩存擊穿和緩存雪崩的問題。

為此,有不少小伙伴問我:什么是緩存穿透?什么是緩存擊穿,什么是緩存雪崩呢?它們是如何造成的?又該如何解決呢?能不能帶著我們寫一個徹底解決緩存擊穿、穿透和雪崩問題的項目呢?以便后續(xù)使用到自己的實際業(yè)務項目中。

所以,冰河開始籌劃帶著大家從零開始手搓一個徹底解決緩存擊穿、穿透和雪崩問題的高性能Redis組件,這個項目不僅僅是從理論上來闡述這些內(nèi)容。

更是要帶著大家一起手搓生產(chǎn)級高并發(fā)場景下緩存擊穿、穿透和雪崩問題解決方案的落地代碼,讓大家掌握的不僅僅是理論知識,更是落地到代碼的解決方案。

二、適用場景

高性能Redis組件旨在徹底解決緩存擊穿、穿透和雪崩問題,支持各種高并發(fā)、高性能場景,支持各種靈活多變的復雜Redis讀寫場景。

既然高性能Redis組件要徹底解決緩存擊穿、穿透和雪崩問題,那到底什么是緩存擊穿、穿透和雪崩問題,理論上又有哪些解決方案呢?

2.1 緩存擊穿

如果我們?yōu)榫彺嬷械拇蟛糠謹?shù)據(jù)設置了相同的過期時間,則到了某一時刻,緩存中的數(shù)據(jù)就會批量過期。

2.1.1 什么是緩存擊穿?

如果緩存中的數(shù)據(jù)在某個時刻批量過期,導致大部分用戶的請求都會直接落在數(shù)據(jù)庫上,這種現(xiàn)象就叫作緩存擊穿。

可以使用下圖來表示緩存擊穿的線程。

圖片圖片

造成緩存擊穿的主要原因就是:我們?yōu)榫彺嬷械臄?shù)據(jù)設置了過期時間。如果在某個時刻從數(shù)據(jù)庫獲取了大量的數(shù)據(jù),并設置了相同的過期時間,這些緩存的數(shù)據(jù)就會在同一時刻失效,造成緩存擊穿問題。

2.1.2 如何解決緩存擊穿問題?

對于比較熱點的數(shù)據(jù),我們可以在緩存中設置這些數(shù)據(jù)永不過期;也可以在訪問數(shù)據(jù)的時候,在緩存中更新這些數(shù)據(jù)的過期時間;如果是批量入庫的緩存項,我們可以為這些緩存項分配比較合理的過期時間,避免同一時刻失效。

還有一種解決方案就是:使用分布式鎖,保證對于每個Key同時只有一個線程去查詢后端的服務,某個線程在查詢后端服務的同時,其他線程沒有獲得分布式鎖的權限,需要進行等待。不過在高并發(fā)場景下,這種解決方案對于分布式鎖的訪問壓力比較大。

2.2 緩存穿透

緩存穿透問題在一定程度上與緩存命中率有關。如果我們的緩存設計的不合理,緩存的命中率非常低,那么,數(shù)據(jù)訪問的絕大部分壓力都會集中在后端數(shù)據(jù)庫層面。

2.2.1 什么是緩存穿透?

如果在請求數(shù)據(jù)時,在緩存層和數(shù)據(jù)庫層都沒有找到符合條件的數(shù)據(jù),也就是說,在緩存層和數(shù)據(jù)庫層都沒有命中數(shù)據(jù),那么,這種情況就叫作緩存穿透。

可以使用下圖來表示緩存穿透的現(xiàn)象。

圖片圖片

造成緩存穿透的主要原因就是:查詢某個Key對應的數(shù)據(jù),Redis緩存中沒有相應的數(shù)據(jù),則直接到數(shù)據(jù)庫中查詢。數(shù)據(jù)庫中也不存在要查詢的數(shù)據(jù),則數(shù)據(jù)庫會返回空,而Redis也不會緩存這個空結(jié)果。

這就造成每次通過這樣的Key去查詢數(shù)據(jù)都會直接到數(shù)據(jù)庫中查詢,Redis不會緩存空結(jié)果。這就造成了緩存穿透的問題。

2.2.2 如何解決緩存穿透問題?

既然我們知道了造成緩存穿透的主要原因就是緩存中不存在相應的數(shù)據(jù),直接到數(shù)據(jù)庫查詢,數(shù)據(jù)庫返回空結(jié)果,緩存中不存儲空結(jié)果。

那我們就自然而然的想到了第一種解決方案:就是把空對象緩存起來。當?shù)谝淮螐臄?shù)據(jù)庫中查詢出來的結(jié)果為空時,我們就將這個空對象加載到緩存,并設置合理的過期時間,這樣,就能夠在一定程度上保障后端數(shù)據(jù)庫的安全。

第二種解決緩存穿透問題的解決方案:就是使用布隆過濾器,布隆過濾器可以針對大數(shù)據(jù)量的、有規(guī)律的鍵值進行處理。一條記錄是不是存在,本質(zhì)上是一個Bool值,只需要使用 1bit  就可以存儲。我們可以使用布隆過濾器將這種表示是、否等操作,壓縮到一個數(shù)據(jù)結(jié)構(gòu)中。比如,我們最熟悉的用戶性別這種數(shù)據(jù),就非常適合使用布隆過濾器來處理。

2.3 緩存雪崩

如果緩存系統(tǒng)出現(xiàn)故障,所有的并發(fā)流量就會直接到達數(shù)據(jù)庫。

2.3.1 什么是緩存雪崩?

如果在某一時刻緩存集中失效,或者緩存系統(tǒng)出現(xiàn)故障,所有的并發(fā)流量就會直接到達數(shù)據(jù)庫。數(shù)據(jù)存儲層的調(diào)用量就會暴增,用不了多長時間,數(shù)據(jù)庫就會被大流量壓垮,這種級聯(lián)式的服務故障,就叫作緩存雪崩。

可以用下圖來表示緩存雪崩的現(xiàn)象。

圖片圖片

造成緩存雪崩的主要原因就是緩存集中失效,或者緩存服務發(fā)生故障,瞬間的大并發(fā)流量壓垮了數(shù)據(jù)庫。

2.3.2 如何解決緩存雪崩問題?

解決緩存雪崩問題最常用的一種方案就是保證Redis的高可用,將Redis緩存部署成高可用集群(必要時候做成異地多活),可以有效的防止緩存雪崩問題的發(fā)生。

為了緩解大并發(fā)流量,我們也可以使用限流降級的方式防止緩存雪崩。例如,在緩存失效后,通過加鎖或者使用隊列來控制讀數(shù)據(jù)庫寫緩存的線程數(shù)量。具體點就是設置某些Key只允許一個線程查詢數(shù)據(jù)和寫緩存,其他線程等待。則能夠有效的緩解大并發(fā)流量對數(shù)據(jù)庫打來的巨大沖擊。

另外,我們也可以通過數(shù)據(jù)預熱的方式將可能大量訪問的數(shù)據(jù)加載到緩存,在即將發(fā)生大并發(fā)訪問的時候,提前手動觸發(fā)加載不同的數(shù)據(jù)到緩存中,并為數(shù)據(jù)設置不同的過期時間,讓緩存失效的時間點盡量均勻,不至于在同一時刻全部失效。

至此,我們已經(jīng)了解了什么是緩存擊穿、穿透和雪崩,也了解了如何解決這些問題。那落地到代碼該如何實現(xiàn)呢?這就是我們手寫的高性能Redis組件要解決的核心問題。

三、適應人群

大廠向來注重性能,并且在高并發(fā)、大流量場景下是絕對不允許出現(xiàn)緩存擊穿、穿透和雪崩問題。

否則,一旦出現(xiàn)這些問題,大量流量打向數(shù)據(jù)庫,數(shù)據(jù)庫由于根本扛不住這么大的流量而被瞬間擊垮,導致整個系統(tǒng)都可能陷入癱瘓和宕機,那勢必為大廠帶來巨大的經(jīng)濟損失。所以,大廠是絕對不允許出現(xiàn)緩存擊穿、穿透和雪崩問題的。

所以,熟練掌握緩存擊穿、穿透和雪崩問題的基本概念和常用的解決方案,已經(jīng)是進大廠必備的基礎技能。如果小伙伴們現(xiàn)在已經(jīng)在大廠,亦或是想要進入大廠,那高性能Redis組件是你必須要掌握的。

如果小伙伴們已經(jīng)在大廠,不了解緩存擊穿、穿透和雪崩問題的處理方案,或者想要進入大廠,亦或是一直突破不了自己的技術瓶頸,平時受如下問題困擾,可以跟冰河一起學習手寫高性能Redis組件,從根本上突破自己的技術瓶頸,積累更多大廠處理實際問題的經(jīng)驗。

  • 剛畢業(yè),想快速提升自己,快速積累緩存相關問題的處理方案經(jīng)驗,但不知從何學起。
  • 校招、社招沒什么拿的出手的項目,簡歷上寫的項目沒啥含金量,投出的簡歷石沉大海。
  • 一直在小公司做CRUD,數(shù)據(jù)量也不多,公司規(guī)范不健全,根本不知道還有緩存擊穿、穿透和雪崩這回事。
  • 公司項目沒什么并發(fā),在線人數(shù)也不多,系統(tǒng)并發(fā)量不高,只是簡單的CRUD就能滿足需求。
  • 學了一些緩存相關的知識,也知道一些基本概念,能說出一些簡單的方案,但是沒實際項目經(jīng)驗。
  • 自我感覺掌握了一些緩存擊穿、穿透和雪崩問題的處理方案,但是在真正做項目時,還是不知道如何下手,面試時也是一臉懵逼。
  • 想做一些緩存處理相關的中間件和業(yè)務項目,根本不知道怎么做,更別提架構(gòu)設計和研發(fā)了。
  • 簡歷上寫了了解或熟悉緩存擊穿、穿透和雪崩問題的處理方案,在面試過程中,面試官一般會基于簡歷循序漸進深入發(fā)問,不知道怎么回答。
  • 在大廠工作多年,參與了一些系統(tǒng)的建設與研發(fā),但是也沒機會參與緩存問題處理方案的整個建設過程,很難積累系統(tǒng)性處理緩存問題的方案知識。
  • 其他問題。。。

從各位小伙伴的反饋來看,小公司的小伙伴受限于業(yè)務,接觸不到高并發(fā)、大流量的業(yè)務場景,也不會涉及到緩存擊穿、穿透和雪崩問題。

大廠的小伙伴由于某些原因接觸不到緩存問題處理方案的整個建設過程,很難積累緩存擊穿、穿透和雪崩問題處理方案的知識。沒有系統(tǒng)性落地成實際項目的經(jīng)驗,很難成體系的積累處理緩存問題方案的編程經(jīng)驗。

所以,如果你正在被如上問題所困擾,不妨跟冰河一起學習下手寫高性能Redis組件項目,向前邁出一小步,或許困擾你的問題就能迎刃而解。

四、技術選型

這次帶著大家一起手寫的高性能Redis組件,在代碼結(jié)構(gòu)上非常精簡,核心功能就是解決緩存擊穿、穿透和雪崩問題。主要的技術選型如下:

  • 容器框架:Spring(不強制依賴)
  • Redis框架:Redisson(不強制依賴)
  • 單元測試:Junit(不強制依賴)
  • 基準性能測試:JMH(不強制依賴)
責任編輯:武曉燕 來源: 冰河技術
相關推薦

2020-03-16 14:57:24

Redis面試雪崩

2019-10-12 14:19:05

Redis數(shù)據(jù)庫緩存

2023-03-10 13:33:00

緩存穿透緩存擊穿緩存雪崩

2022-11-18 14:34:28

2019-11-05 14:24:31

緩存雪崩框架

2022-05-27 07:57:20

緩存穿透緩存雪崩緩存擊穿

2023-10-13 08:11:22

2023-04-14 07:34:19

2021-06-05 09:01:01

Redis緩存雪崩緩存穿透

2025-05-28 02:25:00

高并發(fā)緩存穿透雪崩

2022-03-08 00:07:51

緩存雪崩數(shù)據(jù)庫

2020-10-23 10:46:03

緩存雪崩擊穿

2023-11-10 14:58:03

2025-06-30 01:55:00

2024-04-18 11:43:28

緩存數(shù)據(jù)庫Redis

2023-11-13 08:11:30

Golang測試驅(qū)動開發(fā)

2024-04-07 00:00:02

Redis雪崩緩存

2021-12-25 22:28:27

緩存穿透緩存擊穿緩存雪崩

2024-03-12 10:44:42

2023-07-19 07:51:43

Redis緩存高可用
點贊
收藏

51CTO技術棧公眾號