問題:黑客拿不存在的id請求後端介面,在redis資料庫中找不到該id的資訊則會去mysql資料庫中查詢。如果黑客發起大量請求請求資料庫是會導致快取擊穿,從而使服務癱瘓。
解決辦法:使用布隆過濾器。
布隆過濾器的優點:
1.簡單好用。
2.儲存量小,幾千萬個id可能所占用的記憶體為幾兆到幾十兆,如果使用常規的資料庫來儲存的話可能需要幾百g到上t的儲存空間。
3.查詢速度快。
1.將存在的id放入布隆過濾器中。
2.在通過id查詢資料的介面中加入該id是否存在於布隆過濾器中,如果不存在則說明該id在資料庫中沒有,可不用查詢mysql資料庫。
static bloomfilter
bloomfilter =bloomfilter.
create
(funnels.
stringfunnel
(charset.
forname
("utf-8"))
,1000
,0.001);
("/bloomfilter"
)@apioperation
("布隆過濾器"
)public responseresult bloomfilter()
return
newresponseresult
(responseenum.success)
;}
使用時只用判斷為true即可
("/bloomfilter/resourceid"
)@apioperation
("布隆過濾器資源測試"
)public responseresult bloomfilterresourceid
(@requestparam
("resourceid"
)string resourceid)
return
newresponseresult
(responseenum.success);}
說明:
list
allresourceid = rescenterdao.
getallresourceid()
;
這一步是從資料庫中獲取某張表所有的id,那麼會存在乙個問題,該錶的資料會新增,導致布隆過濾器中的id不是最新的。解決辦法就是在新增資料,將表的id及時加入到布隆器中。 大資料面試必會問題BitSet以及布隆過濾器
問題 假設你現在要處理這樣乙個問題,你有乙個 並且擁有很多訪客,每當有使用者訪問時,你想知道這個ip是不是第一次訪問你的 這是乙個很常見的場景,為了完成這個功能,你很容易就會想到下面這個解決方案 把訪客的ip存進乙個hash表中,每當有新的訪客到來時,先檢查雜湊表中是否有改訪客的ip,如果有則說明該...
go實現布隆過濾器
布隆過濾器一般用來判斷乙個資料是否在乙個很大的資料集合裡面。當然可以用陣列,集合,樹等資料結構和各種查詢法都可以做同樣的事情,但是布隆過濾器有更好的時間效率和空間效率。位元幣實現spv節點時使用了布隆過濾器來查詢交易。布隆過濾器可以判斷乙個數在不在集合裡,但存在一定的誤判率。布隆過濾器的核心是乙個超...
Bloom Filter 布隆演算法
日常生活中,包括在設計計算機軟體時,我們經常要判斷乙個元素是否在乙個集合中。比如在字處理軟體中,需要檢查乙個英語單詞是否拼寫正確 也就是要判斷它是否在已知的字典中 在 fbi,乙個嫌疑人的名字是否已經在嫌疑名單上 在網路爬蟲裡,乙個 是否被訪問過等等。最直接的方法就是將集合中全部的元素存在計算機中,...