三种去重方式——HashSet、Redis去重、布隆过滤器(BloomFilter)
三種去重方式
去重就有三種實現方式,那有什么不同呢?
HashSet
使用java中的HashSet不能重復的特點去重。優點是容易理解。使用方便。
缺點:占用內存大,性能較低。
Redis去重
使用Redis的set進行去重。優點是速度快(Redis本身速度就很快),而且去重不會占用爬蟲服務器的資源,可以處理更大數據量的數據爬取。
缺點:需要準備Redis服務器,增加開發和使用成本。
布隆過濾器(BloomFilter)
使用布隆過濾器也可以實現去重。優點是占用的內存要比使用HashSet要小的多,也適合大量數據的去重操作。
缺點:有誤判的可能。沒有重復可能會判定重復,但是重復數據一定會判定重復。
布隆過濾器(BloomFilter)
布隆過濾器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一種space efficient的概率型數據結構,用于判斷一個元素是否在集合中。在垃圾郵件過濾的黑白名單方法、爬蟲(Crawler)的網址判重模塊中等等經常被用到。
哈希表也能用于判斷元素是否在集合中,但是布隆過濾器只需要哈希表的1/8或1/4的空間復雜度就能完成同樣的問題。
布隆過濾器可以插入元素,但不可以刪除已有元素。其中的元素越多,誤報率越大,但是漏報是不可能的。
原理:
布隆過濾器需要的是一個位數組(和位圖類似)和K個映射函數(和Hash表類似),在初始狀態時,對于長度為m的位數組array,它的所有位被置0。
?
對于有n個元素的集合S={S1,S2...Sn},通過k個映射函數{f1,f2,......fk},將集合S中的每個元素Sj(1<=j<=n)映射為K個值{g1,g2...gk},然后再將位數組array中相對應的array[g1],array[g2]......array[gk]置為1:
?
如果要查找某個元素item是否在S中,則通過映射函數{f1,f2,...fk}得到k個值{g1,g2...gk},然后再判斷array[g1],array[g2]...array[gk]是否都為1,若全為1,則item在S中,否則item不在S中。
布隆過濾器會造成一定的誤判,因為集合中的若干個元素通過映射之后得到的數值恰巧包括g1,g2,...gk,在這種情況下可能會造成誤判,但是概率很小。
總結
以上是生活随笔為你收集整理的三种去重方式——HashSet、Redis去重、布隆过滤器(BloomFilter)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 案例开发分析 || Sc
- 下一篇: 定时任务 ||