redis是為了解決傳統的關係型資料庫的某些問題而誕生的。因為關係型資料庫資料儲存在硬碟內,而硬碟的反應時間相比於記憶體和cpu慢的多,如果使用者的每一次請求都要到硬碟去讀取資料,那整個應用的使用體驗將大打折扣。所以使用redis將資料庫中的部分資料載入到記憶體中,當使用者訪問此資料時,直接可以從記憶體中獲取,大大提公升了效率。但redis畢竟只是作為乙個快取,redis中儲存的資料也是從硬碟中載入過來的,一般選擇部分訪問頻率高的資料載入到redis,提公升了響應速度,也節省了磁碟i/o資源。當使用者請求某資料,先去redis快取中檢視,如果有直接返回,快速高效。如果沒有就得去資料庫(硬碟)中檢視,如果資料庫有就更新redis。但是碰到下面三種情況時,redis快取就失去了作用:
快取穿透問題
現象:訪問快取和資料庫中都沒有的資料,可能被惡意使用者反**起此種請求,導致資料庫壓力過大。
解決方案:
介面層增加一次檢驗,攔截明顯錯誤的資料訪問請求,如對查詢id<0的使用者的請求直接攔截。
對資料庫也沒有取到的值設定乙個null值,存到快取中,可以設定較短的過期時間,這樣就避免了相同無效請求重複訪問資料庫。
使用布隆過濾器。
快取擊穿問題
現象:大量資料同時到期,導致大量請求直接打到資料庫,導致資料庫壓力過大甚至宕機
解決方案:
設定熱點資料永不過期;
不同資料的快取過期時間不要設定相同,避免多個資料同時過期,瞬間增大資料庫壓力。
Redis快取穿透,穿透擊穿,快取雪崩
乙個一定不存在快取及查詢不到的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。有很多種方法可以有效地解決快取穿透問題,最常見的則是採用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bit...
Redis 快取穿透 快取擊穿 快取雪崩
快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為小於0的資料或id為特別大等不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。舉例 通過分類id查詢廣告集合 param categoryid 廣告分類id return 廣告集合 public listf...
Redis快取穿透 快取擊穿 快取雪崩
4 總結 一般企業都會用到mysql等關係型資料庫,當訪問量不大的時候還可以支撐 當併發量高的時候,比如商品搶購或者主頁訪問瞬間較大的時候,請求直接到達db,可能會導致系統效能急劇下降以致癱瘓。db是面向磁碟的,磁碟io是比較重的操作,效能較低。為了克服上述的問題,通常需要在客戶端和db之間引入一層...