快取如果使用不當會造成什麼後果?

2022-05-15 03:18:05 字數 815 閱讀 2873

了解什麼是 redis 的雪崩和穿透?redis 崩潰之後會怎麼樣?系統該如何應對這種情況?如何處理 redis 的穿透?

對於系統 a,假設每天高峰期每秒 5000 個請求,本來快取在高峰期可以扛住每秒 4000 個請求,但是快取機器意外發生了全盤宕機。快取掛了,此時 1 秒 5000 個請求全部落資料庫,資料庫必然扛不住,它會報一下警,然後就掛了。此時,如果沒用什麼特別的方案來處理這個故障,dba 很著急,重啟資料庫,但是資料庫立馬又被新的流量給打死了。

這就是快取雪崩。

大約在 3 年前,國內比較知名的乙個網際網路公司,曾因為快取事故,導致雪崩,後台系統全部崩潰,事故從當天下午持續到晚上凌晨 3~4 點,公司損失了幾千萬。

快取雪崩的事前事中事後的解決方案如下。

對於系統a,假設一秒 5000 個請求,結果其中 4000 個請求是黑客發出的惡意攻擊。

黑客發出的那 4000 個攻擊,快取中查不到,每次你去資料庫里查,也查不到。

舉個栗子。資料庫 id 是從 1 開始的,結果黑客發過來的請求 id 全部都是負數。這樣的話,快取中不會有,請求每次都「視快取於無物」,直接查詢資料庫。這種惡意攻擊場景的快取穿透就會直接把資料庫給打死。

解決方式很簡單,每次系統 a 從資料庫中只要沒查到,就寫乙個空值到快取裡去,比如set -999 unknown。這樣的話,下次便能走快取了。

ThinkPHP使用不當可能造成敏感資訊洩露

thinkphp在開啟debug的情況下會在runtime目錄下生成日誌,而且debug很多站都沒關的,所以影響應該很大吧 我們來看一下thinkphp3.2版本生成日誌結構 thinkphp3.1結構 runtime logs home 16 09 09.log 可以看到是 專案名 runtime...

閉包,使用不當,會出問題

同事在初始化redis配置的時候,給dial函式賦值時用了閉包,導致程式上線後,資料怎麼都載入不到redis中去,排查了半個多小時,總算找到了罪魁禍首。雖然自己之前對閉包也算了解,但是看到他的那段 的時候,乍一看竟也沒發現出問題來,所以決定寫篇文章加深印象,避免自己以後也犯類似的問題。先上 func...

c thread 使用不當導致的崩潰問題

看個例子 1 class ctimer7 開始8void start 914 15void run 1622 23 結束24 void stop 2532 33 private 34 std thread t 35 std thread t1 36int i 37 bool b exit 38 39...