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

高并發(fā)下如何解決緩存穿透、擊穿、雪崩問(wèn)題?代碼直接開(kāi)源!

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
我們來(lái)說(shuō)說(shuō)緩存穿透。什么是緩存穿透呢?緩存穿透問(wèn)題在一定程度上與緩存命中率有關(guān)。如果我們的緩存設(shè)計(jì)的不合理,緩存的命中率非常低,那么,數(shù)據(jù)訪問(wèn)的絕大部分壓力都會(huì)集中在后端數(shù)據(jù)庫(kù)層面。

記得在《【高并發(fā)】Redis如何助力高并發(fā)秒殺系統(tǒng)?看完這篇我徹底懂了??!》一文中,我們以高并發(fā)秒殺系統(tǒng)中扣減庫(kù)存的場(chǎng)景為例,說(shuō)明了Redis是如何助力秒殺系統(tǒng)的。那么,說(shuō)到Redis,往往更多的場(chǎng)景是被用作系統(tǒng)的緩存,說(shuō)到緩存,尤其是分布式緩存系統(tǒng),在實(shí)際高并發(fā)場(chǎng)景下,稍有不慎,就會(huì)造成緩存穿透、緩存擊穿和緩存雪崩的問(wèn)題。

那什么是緩存穿透?什么是緩存擊穿,又什么是緩存雪崩呢?它們是如何造成的?又該如何解決呢?這次,我們不僅僅是從理論上來(lái)闡述這些內(nèi)容,冰河更是開(kāi)源了生產(chǎn)級(jí)高并發(fā)場(chǎng)景下緩存穿透、擊穿和雪崩問(wèn)題解決方案的落地代碼,讓你掌握的不僅僅是理論知識(shí),更是落地到代碼的解決方案。

緩存穿透

首先,我們來(lái)說(shuō)說(shuō)緩存穿透。什么是緩存穿透呢?緩存穿透問(wèn)題在一定程度上與緩存命中率有關(guān)。如果我們的緩存設(shè)計(jì)的不合理,緩存的命中率非常低,那么,數(shù)據(jù)訪問(wèn)的絕大部分壓力都會(huì)集中在后端數(shù)據(jù)庫(kù)層面。

什么是緩存穿透?

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

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

圖片圖片

造成緩存穿透的主要原因就是:查詢某個(gè)Key對(duì)應(yīng)的數(shù)據(jù),Redis緩存中沒(méi)有相應(yīng)的數(shù)據(jù),則直接到數(shù)據(jù)庫(kù)中查詢。數(shù)據(jù)庫(kù)中也不存在要查詢的數(shù)據(jù),則數(shù)據(jù)庫(kù)會(huì)返回空,而Redis也不會(huì)緩存這個(gè)空結(jié)果。這就造成每次通過(guò)這樣的Key去查詢數(shù)據(jù)都會(huì)直接到數(shù)據(jù)庫(kù)中查詢,Redis不會(huì)緩存空結(jié)果。這就造成了緩存穿透的問(wèn)題。

如何解決緩存穿透問(wèn)題?

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

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

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

緩存擊穿

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

什么是緩存擊穿?

如果緩存中的數(shù)據(jù)在某個(gè)時(shí)刻批量過(guò)期,導(dǎo)致大部分用戶的請(qǐng)求都會(huì)直接落在數(shù)據(jù)庫(kù)上,這種現(xiàn)象就叫作緩存擊穿。

我么可以使用下圖來(lái)表示緩存擊穿的線程。

圖片圖片

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

如何解決緩存擊穿問(wèn)題?

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

還有一種解決方案就是:使用分布式鎖,保證對(duì)于每個(gè)Key同時(shí)只有一個(gè)線程去查詢后端的服務(wù),某個(gè)線程在查詢后端服務(wù)的同時(shí),其他線程沒(méi)有獲得分布式鎖的權(quán)限,需要進(jìn)行等待。不過(guò)在高并發(fā)場(chǎng)景下,這種解決方案對(duì)于分布式鎖的訪問(wèn)壓力比較大。

緩存雪崩

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

什么是緩存雪崩?

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

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

圖片圖片

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

如何解決緩存雪崩問(wèn)題?

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

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

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

落地代碼

冰河已經(jīng)將高并發(fā)場(chǎng)景下解決緩存穿透、擊穿、雪崩問(wèn)題的通用方案落地到代碼,并開(kāi)源,旨在讓大家從源碼級(jí)別更好的掌握解決緩存穿透、擊穿和雪崩問(wèn)題的通用方案。

開(kāi)源項(xiàng)目是基于Redis解決緩存擊穿、穿透和雪崩問(wèn)題的通用解決方案,拿來(lái)即用。支持存儲(chǔ)對(duì)象、集合、簡(jiǎn)單數(shù)據(jù)類型等。無(wú)需提前將數(shù)據(jù)存入Redis,直接使用提供的分布式緩存接口查詢數(shù)據(jù)即可,附帶完善的單元測(cè)試用例,方便學(xué)習(xí)使用,另外,項(xiàng)目的README.md文件中附帶詳細(xì)的核心接口定義、使用案例和單元測(cè)試場(chǎng)景。

開(kāi)源地址如下,如果這個(gè)開(kāi)源項(xiàng)目對(duì)你有點(diǎn)幫助,請(qǐng)給這個(gè)開(kāi)源項(xiàng)目點(diǎn)個(gè)Star,萬(wàn)分感謝!

  • github:https://github.com/binghe001/spring-redis
  • gitee:https://gitee.com/binghe001/spring-redis
  • gitcode:https://gitcode.net/binghe001/spring-redis


責(zé)任編輯:武曉燕 來(lái)源: 冰河技術(shù)
相關(guān)推薦

2023-10-13 08:11:22

2023-07-19 07:51:43

Redis緩存高可用

2020-03-16 14:57:24

Redis面試雪崩

2020-09-14 06:57:30

緩存穿透雪崩

2023-03-10 13:33:00

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

2019-10-12 14:19:05

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

2022-03-08 00:07:51

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

2022-11-18 14:34:28

2018-12-13 12:43:07

Redis緩存穿透

2019-11-05 14:24:31

緩存雪崩框架

2023-11-10 14:58:03

2021-06-05 09:01:01

Redis緩存雪崩緩存穿透

2022-05-27 07:57:20

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

2020-10-23 10:46:03

緩存雪崩擊穿

2020-03-05 09:09:18

緩存原因方案

2025-06-30 01:55:00

2024-04-18 11:43:28

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

2024-04-07 00:00:02

Redis雪崩緩存

2020-12-28 12:37:36

緩存擊穿穿透

2023-04-14 07:34:19

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)