布隆過濾器
快取擊穿
總結有很多使用者,請求介面。
為了防止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形式儲存,在控制層先進行校驗,不符合則丟棄,從而避免...