當前位置:首頁 » 硬碟大全 » 緩存穿透怎麼解決方案
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

緩存穿透怎麼解決方案

發布時間: 2022-12-31 16:19:18

『壹』 緩存穿透的意義

最基本的就是首先做好參數校驗,一些不合法的參數請求直接拋出異常信息返回給客戶端。比如查詢的資料庫 id 不能小於 0、傳入的郵箱格式不對的時候直接返回錯誤消息給客戶端等等。

1)緩存無效 key : 如果緩存和資料庫都查不到某個 key 的數據就寫一個到 redis 中去並設置過期時間,具體命令如下:SET key value EX 10086。這種方式可以解決請求的 key 變化不頻繁的情況,如何黑客惡意攻擊,每次構建的不同的請求key,會導致 redis 中緩存大量無效的 key 。很明顯,這種方案並不能從根本上解決此問題。如果非要用這種方式來解決穿透問題的話,盡量將無效的 key 的過期時間設置短一點比如 1 分鍾。另外,一般情況下我們是這樣設計 key 的: 表名:列名:主鍵名:主鍵值。

2)布隆過濾器:布隆過濾器是一個非常神奇的數據結構,通過它我們可以非常方便地判斷一個給定數據是否存在與海量數據中。我們需要的就是判斷 key 是否合法,有沒有感覺布隆過濾器就是我們想要找的那個「人」。具體是這樣做的:把所有可能存在的請求的值都存放在布隆過濾器中,當用戶請求過來,我會先判斷用戶發來的請求的值是否存在於布隆過濾器中。不存在的話,直接返回請求參數錯誤信息給客戶端,存在的話才會走下面的流程。

『貳』 該怎麼解決 Redis 緩存穿透和緩存雪崩問題

緩存雪崩: 由於緩存層承載著大量請求,有效地 保護了存儲層,但是如果緩存層由於某些原因不能提供服務,比如 Redis 節點掛掉了,熱點 key 全部失效了,在這些情況下,所有的請求都會直接請求到資料庫,可能會造成資料庫宕機的情況。
預防和解決緩存雪崩問題,可以從以下三個方面進行著手:
1、使用 Redis 高可用架構:使用 Redis 集群來保證 Redis 服務不會掛掉
2、緩存時間不一致: 給緩存的失效時間,加上一個隨機值,避免集體失效
3、限流降級策略:有一定的備案,比如個性推薦服務不可用了,換成熱點數據推薦服務
緩存穿透: 緩存穿透是指查詢一個根本不存在的數據,這樣的數據肯定不在緩存中,這會導致請求全部落到資料庫上,有可能出現資料庫宕機的情況。
預防和解決緩存穿透問題,可以考慮以下兩種方法:
1、緩存空對象: 將空值緩存起來,但是這樣就有一個問題,大量無效的空值將佔用空間,非常浪費。
2、布隆過濾器攔截: 將所有可能的查詢key 先映射到布隆過濾器中,查詢時先判斷key是否存在布隆過濾器中,存在才繼續向下執行,如果不存在,則直接返回。布隆過濾器有一定的誤判,所以需要你的業務允許一定的容錯性。

『叄』 redis緩存穿透,頻繁查詢db,怎麼解決

首先要明白redis資料庫

redis內存資料庫, 所數據基本都存於內存, 定追加或者快照式刷新硬碟.
由於redis內存資料庫, 所讀取寫入速度非快, 所經用做數據, 頁面等緩存

『肆』 什麼是緩存穿透

緩存穿透又稱緩存擊穿,是指在高並發場景下緩存中(包括本地緩存和Redis緩存)的某一個Key被高並發的訪問沒有命中,此時回去資料庫中訪問數據,導致資料庫並發的執行大量查詢操作,對DB造成巨大的壓力。

『伍』 什麼是緩存穿透有哪些解決辦法

緩存穿透:指查詢一個一定不存在的數據,由於緩存是不命中時需要從資料庫查詢,查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到資料庫去查詢,造成緩存穿透。
解決方案:最簡單粗暴的方法如果一個查詢返回的數據為空(不管是數據不存在,還是系統故障),我們就把這個空結果進行緩存,但它的過期時間會很短,最長不超過五分鍾。

『陸』 redis常見問題

1. 緩存擊穿

緩存擊穿是指一個請求要訪問的數據,緩存中沒有,但資料庫中有的情況。這種情況一般都是緩存過期了。

但是這時由於並發訪問這個緩存的用戶特別多,這是一個熱點 key,這么多用戶的請求同時過來,在緩存裡面沒有取到數據,所以又同時去訪問資料庫取數據,引起資料庫流量激增,壓力瞬間增大,直接崩潰給你看。

所以一個數據有緩存,每次請求都從緩存中快速的返回了數據,但是某個時間點緩存失效了,某個請求在緩存中沒有請求到數據,這時候我們就說這個請求就"擊穿"了緩存。

針對這個場景,對應的解決方案一般來說有三種。

藉助Redis setNX命令設置一個標志位就行。設置成功的放行,設置失敗的就輪詢等待。就是在更新緩存時加把鎖

後台開一個定時任務,專門主動更新過期數據

比如程序中設置 why 這個熱點 key 的時候,同時設置了過期時間為 10 分鍾,那後台程序在第 8 分鍾的時候,會去資料庫查詢數據並重新放到緩存中,同時再次設置緩存為 10 分鍾。

其實上面的後台續命思想的最終體現是也是永不過期。

只是後台續命的思想,會主動更新緩存,適用於緩存會變的場景。會出現緩存不一致的情況,取決於你的業務場景能接受多長時間的緩存不一致。


2. 緩存穿透

緩存穿透是指一個請求要訪問的數據,緩存和資料庫中都沒有,而用戶短時間、高密度的發起這樣的請求,每次都打到資料庫服務上,給資料庫造成了壓力。一般來說這樣的請求屬於惡意請求。

解決方案有兩種:

就是在資料庫即使沒有查詢到數據,我們也把這次請求當做 key 緩存起來,value 可以是 NULL。下次同樣請求就會命中這個 NULL,緩存層就處理了這個請求,不會對資料庫產生壓力。這樣實現起來簡單,開發成本很低。


3. 緩存雪崩

緩存雪崩是指緩存中大多數的數據在同一時間到達過期時間,而查詢數據量巨大,這時候,又是緩存中沒有,資料庫中有的情況了。

防止雪崩的方案簡單來說就是錯峰過期。

在設置 key 過期時間的時候,在加上一個短的隨機過期時間,這樣就能避免大量緩存在同一時間過期,引起的緩存雪崩。

如果發了雪崩,我們可以有服務降級、熔斷、限流手段來拒絕一些請求,保證服務的正常。但是,這些對用戶體驗是有一定影響的。

4. Redis 高可用架構

Redis 高可用架構,大家基本上都能想到主從、哨兵、集群這三種模式。

哨兵模式:

它主要執行三種類型的任務:

哨兵其實也是一個分布式系統,我們可以運行多個哨兵。

然後這些哨兵之間需要相互通氣,交流信息,通過投票來決定是否執行自動故障遷移,以及選擇哪個從伺服器作為新的主伺服器。

哨兵之間採用的協議是 gossip,是一種去中心化的協議,達成的是最終一致性。

選舉規則: