Redis從入門到精通-應用問題解決-快取穿透
一、問題描述
key對應的資料在資料來源並不存在,每次針對此key的請求從快取獲取不到,請求都會壓到資料來源,從而可能壓垮資料來源。比如用一個不存在的使用者id獲取使用者資訊,不論快取還是資料庫都沒有,若黑客利用此漏洞進行攻擊可能壓垮資料庫。
解釋
1、redis查詢不到資料了,造成大面積的未命中
比如出現很多為空的查詢,而這些為空的查詢沒有進行快取,此時請求就會大面積的打到資料庫。
2、出現很多非正常的url訪問(其實還是查出空資料)
什麼是非正常的url,比如正常的是 /getBook/1 得到id為1 的book資料,非正常的 /getBook/a 或者 /getBook/1000000 id資料庫裡面沒有,也就是說還是查的空資料,此時redis沒有將空資料快取,大量請求就會打到資料庫,從而將其壓垮。
解決方案
一個一定不存在快取及查詢不到的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。
解決方案:
(1)對空值快取:如果一個查詢返回的資料為空(不管是資料是否不存在),我們仍然把這個空結果(null)進行快取,設定空結果的過期時間會很短,最長不超過五分鐘
(2)設定可訪問的名單(白名單):
使用bitmaps型別定義一個可以訪問的名單,名單id作為bitmaps的偏移量,每次訪問和bitmap裡面的id進行比較,如果訪問id不在bitmaps裡面,進行攔截,不允許訪問。
(3)
布隆過濾器可以用於檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。)
將所有可能存在的資料雜湊到一個足夠大的bitmaps中,一個一定不存在的資料會被 這個bitmaps攔截掉,從而避免了對底層儲存系統的查詢壓力。
(4) 進行實時監控:當發現Redis的命中率開始急速降低,需要排查訪問物件和訪問的資料,和運維人員配合,可以設定黑名單限制服務