了解什麼是 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...