一文了解什麼是快取擊穿 快取雪崩 快取穿透

2021-10-06 03:22:27 字數 1802 閱讀 7839

前言

我們知道常見的資料庫,比如oracle、mysql等,資料都是存放在磁碟中,所以當業務系統對資料庫進行頻繁的增刪改查時。將會給資料庫帶來巨大的i/o壓力,因此需要資料庫快取技術來實現資料的快取記憶體,減少資料庫的壓力,但是資料庫快取也會帶來一系列問題,本文就快取資料庫及其帶來的幾個典型問題進行乙個簡單的闡述。

正文以redis為例,因為資料庫快取存在於記憶體中,這本身就保證了資料的訪問速度大大優於磁碟io,其次,redis中儲存的是資料庫中常訪問的資料,當客戶端發起乙個查詢請求時,先到redis查詢,redis中沒有,再到資料庫中查詢,然後再將資料寫入redis快取,並返回響應。這樣就使得客戶端的訪問不會大量衝擊資料庫,造成資料庫崩潰。

我們知道,就定址速度而言,磁碟是ms級的,記憶體是nm級的,記憶體的定址速度是磁碟的10w倍,如果不加快取,那麼使用者的請求將直接訪問磁碟,這樣就導致系統的響應速度變慢,如果訪問量再增大,那麼有些訪問請求就可能超時,導致使用者體驗變差。而加了快取,使用者的請求就先從記憶體中查詢,大大減少了響應時間,特別是對於一些熱點資料,redis更是能發揮它的作用。

資料顯示,當單機的mysql併發量達到1秒2k時,就可能導致崩潰,而海量資料或者熱點資料併發量遠遠不止這個數,而使用快取,可以使單機的併發量提高到1萬甚至幾十萬,原因就在於記憶體對高併發的支援。redis通過主從架構,實現讀寫分離,主節點負責寫,並將資料同步給其他從節點,從節點負責讀,從而實現高併發。如果快取要容納的資料量很大,達到了幾十g,甚至幾百g,或者是幾t,那麼就需要redis集群,使用redis集群之後,可以提供可能每秒幾十萬的讀寫併發。

快取中沒有但是資料庫有的資料,如果此時使用者併發量特別大,而快取中又沒有這條資料,那麼大量的使用者請求就會直接衝擊資料庫,造成資料庫崩潰,可能的原因是熱點資料快取過期

解決方案:

加互斥鎖,當快取中沒有該資料時,獲取互斥鎖,進入資料庫讀取資料,其他執行緒等待獲取鎖。

提前預估熱點資料過期時間,定期更新,保證熱點資料不過期。

設定熱點資料快取永不過期。

使用布隆過濾器對所有可能查詢的引數以hash形式儲存,當使用者想要查詢的時候,使用布隆過濾器,如果發現不在集合中,就直接丟棄,不再對持久層查詢。

快取中資料大批量到過期時間,而查詢資料量巨大,引起資料庫壓力過大甚至宕機。和快取擊穿不同的是,快取擊穿指併發查同一條資料,快取雪崩是不同資料都過期了,很多資料都查不到從而查資料庫

解決辦法

快取資料的過期時間設定隨機,防止同一時間大量資料過期現象發生。

如果快取資料庫是分布式部署,將熱點資料均勻分布在不同搞得快取資料庫中。

快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為「-1」的資料或id為特別大不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。

解決辦法

介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id<=0的直接攔截;

快取空物件。當儲存層不命中後,即使返回的空物件也將其快取起來,同時會設定乙個過期時間,之後再訪問這個資料將會從快取中獲取,保護了後端資料來源;

什麼是快取穿透 快取雪崩 快取擊穿

快取穿透是指查詢乙個一定不存在的資料時,由於在快取中沒有這個key,這時會到db中去查詢,可是db中也沒有這條資料,這時也無法寫入快取,這就造成了快取穿透,如果這時有人利用這個漏洞頻繁攻擊應用,db就可能掛掉了 解決方案 可以把key存入快取中,value設定為空,過期時間最多不超過5分鐘 快取雪崩...

什麼是redis快取穿透,快取雪崩,快取擊穿

一.快取穿透 快取穿透是指查詢資料庫中一定不存在的資料,我們正常的操作流程,在查詢資料庫前,先去查詢快取,如果key不存在或者key過期失效,再去查詢資料庫,並把查詢到的物件放到快取中,如果查詢到的資料為null,不新增快取。流程 二.快取雪崩 快取雪崩可以理解為在某個時間段,快取集中過期,然後這段...

什麼是Redis快取穿透 快取雪崩 快取擊穿

快取穿透,是指查詢乙個資料庫一定不存在的資料。正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。採用快取空值的方式,也就是 流程 中第5步,如果從資料庫查詢的物件為空,也放入快取...