成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

高并發下緩存穿透、擊穿、雪崩問題的解決方案,落地到代碼該如何實現?

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

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

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

緩存穿透

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

什么是緩存穿透?

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

我們可以使用下圖來表示緩存穿透的現象。

圖片圖片

造成緩存穿透的主要原因就是:查詢某個Key對應的數據,Redis緩存中沒有相應的數據,則直接到數據庫中查詢。數據庫中也不存在要查詢的數據,則數據庫會返回空,而Redis也不會緩存這個空結果。這就造成每次通過這樣的Key去查詢數據都會直接到數據庫中查詢,Redis不會緩存空結果。這就造成了緩存穿透的問題。

如何解決緩存穿透問題?

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

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

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

緩存擊穿

如果我們為緩存中的大部分數據設置了相同的過期時間,則到了某一時刻,緩存中的數據就會批量過期。

什么是緩存擊穿?

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

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

圖片圖片

造成緩存擊穿的主要原因就是:我們為緩存中的數據設置了過期時間。如果在某個時刻從數據庫獲取了大量的數據,并設置了相同的過期時間,這些緩存的數據就會在同一時刻失效,造成緩存擊穿問題。

如何解決緩存擊穿問題?

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

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

緩存雪崩

如果緩存系統出現故障,所有的并發流量就會直接到達數據庫。

什么是緩存雪崩?

如果在某一時刻緩存集中失效,或者緩存系統出現故障,所有的并發流量就會直接到達數據庫。數據存儲層的調用量就會暴增,用不了多長時間,數據庫就會被大流量壓垮,這種級聯式的服務故障,就叫作緩存雪崩。

我們可以用下圖來表示緩存雪崩的現象。

圖片圖片

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

如何解決緩存雪崩問題?

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

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

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

落地代碼

冰河已經將高并發場景下解決緩存穿透、擊穿、雪崩問題的通用方案落地到代碼,并開源,旨在讓大家從源碼級別更好的掌握解決緩存穿透、擊穿和雪崩問題的通用方案。

開源項目是基于Redis解決緩存擊穿、穿透和雪崩問題的通用解決方案,拿來即用。支持存儲對象、集合、簡單數據類型等。無需提前將數據存入Redis,直接使用提供的分布式緩存接口查詢數據即可,附帶完善的單元測試用例,方便學習使用,另外,項目的README.md文件中附帶詳細的核心接口定義、使用案例和單元測試場景。

開源地址如下,如果這個開源項目對你有點幫助,請給這個開源項目點個Star,萬分感謝!

  • github:https://github.com/binghe001/spring-redis
  • gitee:https://gitee.com/binghe001/spring-redis
  • gitcode:https://gitcode.net/binghe001/spring-redis
責任編輯:武曉燕 來源: 冰河技術
相關推薦

2023-10-13 08:11:22

2025-05-28 02:25:00

高并發緩存穿透雪崩

2023-11-10 14:58:03

2020-03-05 09:09:18

緩存原因方案

2020-03-16 14:57:24

Redis面試雪崩

2023-03-10 13:33:00

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

2019-10-12 14:19:05

Redis數據庫緩存

2022-03-08 00:07:51

緩存雪崩數據庫

2022-11-18 14:34:28

2019-11-05 14:24:31

緩存雪崩框架

2021-06-05 09:01:01

Redis緩存雪崩緩存穿透

2022-05-27 07:57:20

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

2020-10-23 10:46:03

緩存雪崩擊穿

2020-09-14 06:57:30

緩存穿透雪崩

2023-04-14 07:34:19

2024-07-12 08:48:50

2021-01-31 10:51:37

緩存lock數據

2024-04-18 11:43:28

緩存數據庫Redis

2024-04-07 00:00:02

Redis雪崩緩存

2020-12-28 12:37:36

緩存擊穿穿透
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精点视频 | 国产一区二区麻豆 | 久久国产成人午夜av影院武则天 | 四虎影视1304t | 成人av在线网站 | 久色网| 毛色毛片免费看 | 国产成人亚洲精品自产在线 | 熟女毛片 | 亚洲夜夜爽 | 欧美视频一区二区三区 | 欧美国产亚洲一区二区 | 日本粉嫩一区二区三区视频 | 五月天国产 | 亚洲第一免费播放区 | 国产一区视频在线 | 久久久123 | 亚洲精品黑人 | 久久精品一区 | 国产视频精品在线 | 日本超碰 | 羞羞的视频网站 | 欧美电影一区 | 免费美女网站 | 久久久久国| 91久久国产综合久久91精品网站 | 亚洲视频www | 另类专区成人 | 久久久久久九九九九九九 | 国产麻豆乱码精品一区二区三区 | 国产精品久久久久久久久久久久冷 | 特级黄一级播放 | 成人影院免费视频 | 在线观看黄色 | 国产成人免费视频网站高清观看视频 | 在线欧美视频 | 国产成人久久精品 | 欧美一区二区三区在线观看 | 国产精品久久久久久久久久久久午夜片 | 国产一区二区精品在线观看 | 日本在线综合 |