1耘戚、布隆過濾器是什么,一定要用嗎?
(1)黑客流量攻擊:故意訪問不存在的數(shù)據(jù)操漠,導(dǎo)致程序不斷訪問DB數(shù)據(jù)庫的數(shù)據(jù)
(2)黑客安全阻截:當(dāng)黑客訪問不存在的緩存時迅速返回避免緩存及DB掛掉
(3)思考:如果讓你實現(xiàn)這個功能你會怎么做收津? key:10000 10001 10002 10003 大集合,key是否在集合里面
- 分析java常用數(shù)據(jù)結(jié)構(gòu)復(fù)習(xí) set map key,value list 有序get[0]浊伙、get[1]撞秋;
- list.contain (key)遍歷數(shù)據(jù),進(jìn)行equals()比較嚣鄙,性能小
- set.contain(key) hashcode比較吻贿,性能較高,64位 1G
- map.get(key) hashcode比較哑子,性能還行
2、概念:
布隆過濾器(英語:Bloom Filter)是1970年由布隆提出的赵抢。它實際上是一個很長的二進(jìn)制向量和一系
列隨機(jī)映射函數(shù)剧蹂。布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優(yōu)點是空間效率和查詢時
間都遠(yuǎn)遠(yuǎn)超過一般的算法烦却,缺點是有一定的誤識別率和刪除困難宠叼。
- 優(yōu)點:
相比于其它的數(shù)據(jù)結(jié)構(gòu),布隆過濾器在空間和時間方面都有巨大的優(yōu)勢。布隆過濾器存儲空間和插入/
查詢時間都是常數(shù)({\displaystyle O(k)} )冒冬。另外伸蚯,散列函數(shù)相互之間沒有關(guān)系,方便由硬件并
行實現(xiàn)简烤。布隆過濾器不需要存儲元素本身,在某些對保密要求非常嚴(yán)格的場合有優(yōu)勢 - 缺點
但是布隆過濾器的缺點和優(yōu)點一樣明顯横侦。誤算率是其中之一挥萌。隨著存入的元素數(shù)量增加,誤算率隨之增
加枉侧。但是如果元素數(shù)量太少引瀑,則使用散列表足矣
3、布隆過濾器的其他使用場景?
(1)網(wǎng)頁爬蟲對URL的去重榨馁,避免爬取相同的URL地址憨栽;
(2)反垃圾郵件,從數(shù)十億個垃圾郵件列表中判斷某郵箱是否垃圾郵箱(同理翼虫,垃圾短信)屑柔;
(3)緩存擊穿,將已存在的緩存放到布隆中珍剑,當(dāng)黑客訪問不存在的緩存時迅速返回避免緩存及DB掛掉掸宛。
4、給Redis安裝Bloom Filter
git clone git://github.com/RedisLabsModules/rebloom //在一個文件錄下下載
$ cd rebloom
$ make
安裝完成后會生成一個“redisbloom.so”
5|將Rebloom加載到Redis中次慢,在redis.conf里面添加
[圖片上傳中...(image.png-b8e233-1600066865250-0)]
loadmodule /usr/local/rebloom/rebloom.so //對應(yīng)自己的安裝的Bloom Filter的路徑
6旁涤、命令測試
布隆過濾器有二個基本指令,bf.add 添加元素迫像,bf.exists 查詢元素是否存在劈愚,它的用法和 set 集合的 sadd 和 sismember 差不多。注意 bf.add 只能一次添加一個元素闻妓,如果想要一次添加多個菌羽,就需要用到 bf.madd 指令。同樣如果需要一次查詢多個元素是否存在由缆,就需要用到 bf.mexists 指令注祖。
(1)BF.ADD bloom redis
(2)BF.EXISTS bloom redis
(3)BF.EXISTS bloom nonxist