redis 快取擊穿和快取穿透

2021-10-06 08:00:38 字數 2553 閱讀 2347

布隆過濾器

快取擊穿

總結有很多使用者,請求介面。

為了防止mysql壓力過大,在訪問量很大且資料變動不頻繁的情況下,我們通過增加redis快取減少mysql的壓力。

正常的流程為下圖所示。

//redis中無資料,從mysql中查詢

$mysqlserver

=mysqli_connect

('127.0.0.1'

,'user'

,'123');

$select_db

=mysqli_select_db

($mysqlserver

,'test');

if(empty

($select_db))

//查詢**

$sql

="select * from db_test where `id` = "

.$key

." limit 1"

;$mysqlres

=mysqli_query

($mysqlserver

,$sql);

while

($row

=mysqli_fetch_row

($mysqlres))

if(empty

($res))

else

return

"nil"

;}那麼如上的流程,存在一種情況,redis中沒有資料,資料庫也沒有此資料,最後會返回nil。

但是每次訪問都會請求redis也會請求mysql。

這樣子相當於這條請求穿透了redis也穿透了mysql。

當這種請求數目多的時候,對mysql伺服器壓力很大,很有可能導致服務崩潰。

這就是快取穿透。

當然,有人可能會想到解決策略,如果mysql中沒有,我們就在redis中增加過濾策略。

那麼會出現兩種情況。

如果key未設定快取過期時間,則redis的占用會越來越大。

如果key設定了過期時間,好處是會過濾其中一部分請求,但是redis也會增長,mysql依然會面臨一定壓力的訪問。

我們可以在redis後增加一層強有力的過濾。

布隆過濾器。

那麼,為什麼用布隆過濾器好,並且,為什麼要用布隆過濾器呢?

這裡簡單說明介紹一下布隆過濾器,之後會在部落格中詳細介紹。

布隆過濾器是乙個叫「布隆」的人提出的,它本身是乙個很長的二進位制向量,既然是二進位制的向量,那麼顯而易見的,存放的不是0,就是1。參見位圖。

比如我們需要向布隆過濾器新增幾個數字,1,2,3,4,5布隆過濾器長度為8。

初始每個位都是0。

1,2,3,4,5經過hash分別對應位置1。

但是有乙個問題,如果這些格仔裡面放置的都是1,不一定代表給定的資料一定重複,也許其他資料經過三種固定的計算方式算出來的結果也是相同的。這也很好理解吧,比如我們需要判斷物件是否相等,是不可以僅僅判斷他們的雜湊值是否相等的。

也就是說布隆過濾器只能判斷資料是否一定不存在,而無法判斷資料是否一定存在。

優點:由於存放的不是完整的資料,所以占用的記憶體很少,而且新增,查詢速度夠快;

缺點: 隨著資料的增加,誤判率隨之增加;無法做到刪除資料;只能判斷資料是否一定不存在,而無法判斷資料是否一定存在。

上述就是快取穿透現象,現在說一下快取擊穿現象。

快取擊穿是因為請求的資料不在redis中,快取擊穿相比於快取穿透要簡單一些,快取擊穿為redis鍵值失效或者redis伺服器出現異常,請求直接打在資料庫上。

這些資料在mysql上是有的,所以並不會出現穿透的現象,但是同樣會給redis很大的壓力。

這時候,布隆過濾器已經沒有作用了,因為資料是有的不能過濾掉。

此時的邏輯

如果是快取失效的問題,可以根據業務具體判斷是否不設定失效時間。

如果是redis伺服器的問題,我們可以增加一些有利的防護。

1.redis哨兵,redis cluster避免全盤崩潰。

2.在結束後可以利用redis rdb和aof去進行恢復資料。

快取有利有弊,需要根據業務形態以及結合自身考慮去使用。

請再努力一些。

–2020.5.20晚。

Redis 快取穿透 快取雪崩和快取擊穿

快取穿透,是指查詢乙個資料庫一定不存在的資料。正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。流程 引數傳入物件主鍵id 根據key從快取中獲取物件 如果物件不為空,直接返回 ...

redis快取穿透 快取雪崩和快取擊穿

查詢資料庫中一定不存在的資料,使用者發出查詢請求,根據引數 主鍵id 首先根據key去查詢redis,發現為空,接著查詢資料庫發現沒有結果,然後不會往redis中存入任何資料,接下來所有的請求都會往復進行,都會訪問資料庫,造成資料庫壓力。解決快取穿透,可以在第一次查詢資料庫時,如果返回空,則在red...

Redis快取穿透 快取雪崩和快取擊穿

是指查詢乙個資料庫一定不存在的資料。正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。布隆過濾 對所有可能查詢的引數以hash形式儲存,在控制層先進行校驗,不符合則丟棄,從而避免...