过滤器适合大数据判重的场景,如网络爬虫中判断一个URL是否已经爬取过,判断一个用户是否在黑名单中,判断一个邮件是否是垃圾邮件,等等。 优点:占用空间小,效率高,简而言之,就是以正确率换空间和时间。
转载 2023-06-02 06:27:30
71阅读
目录 一、概述二、详解三、实现四、适用业务场景一、概述简单讲过滤器就是判断一个列表中是否存在某个元素。一般在JAVA判断是否存在,我们可以Map,Set等容器。但是当数据量特别大的时候,用Map和Set会占用过多的内存。这个时候就会考虑用布过滤器了。二、详解要创建一个过滤器首选需要在内存中声明一个Bit数组,假设数组的长度为L,初始值全部为0。    &nb
过滤器一般用来判断一个数据是否在一个很大的数据集合里面。当然可以用数组,集合,树等数据结构和各种查找法都可以做同样的事情,但是过滤器有更好的时间效率和空间效率。比特币实现SPV节点时使用过滤器来查询交易。过滤器可以判断一个数在不在集合里,但存在一定的误判率。过滤器的核心是一个超大的位数组和几个哈希函数。假设位数组的长度为m,哈希函数的个数为k。  &nbs
概述过滤器(Bloom Filter)是1970年由提出的。它实际上是一个很长的二进制向量和一系列随机映射函数,过滤器可以用于检索一个元素是否在一个集合中。如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn
最近搞NLP爬了点数据,有地方需要判断一些字符串是否在一个大集合里面出现过,联想到了此前的经历过的一个面试题。问:在做网络爬虫的时候,经常会有URL重复出现,怎么规避这种情况? 答:Java里面可以用HashSet保存已经访问过的URL。 问:如果这个URL的量很多呢?比如十亿条? 答:如果能够忍受一定错误率的话,可以使用过滤器,balabala…一、基本概念上面已经介绍了过滤器的一个常用
       大批量数据去重,特别的占用内存。但是用布过滤器(Bloom Filter)会非常的省内存。亲测了一遍,果然是不错的。现将测试代码发出来,一来给自己做个笔记,二来希望大家一起学习。一:过滤器介绍       介绍:过滤器的主要是由一个很长的二进制向量和若干个(k个)散列映射函数组成。因为每个元数据
目录1、过滤器的作用2、过滤器原理3、使用场景4、三种实现方式4.1 自定义实现4.1.1 需要实现以下功能:4.1.2 代码:4.1.3 测试:4.2 GoogleGuava实现4.2.1 添加Guava 依赖4.2.2 BloomFilter构造方法4.2.3 判定基本数据类型4.2.4 判定自定义类4.3 Redis实现4.3.1 使用redis的module功能4.3.2 利用r
缓存穿透的问题?缓存穿透: 指定使用一些不存在的key进行大量的查询Redis,导致无法命中,每次请求都会传到持久层进行查询,导致对数据库的压力非常大。那摩有哪些解决方案呢?对我们的服务接口实现限流,用户授权、黑名单和白名单拦截从缓存和数据库都查询不到结果的话,一样将数据库空值结果缓存到Redis中:设置30s的有效期避免使用同一个id对数据库攻击,但是如果真是黑客要搞你,那摩他随机生成的id肯定
过滤器 过滤器(Bloom Filter)是1970年由提出的。它实际上是一个很长的二进制矢量和一系列随机映射函数。过滤器用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。基本概念 如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表、树、散列表(又叫哈希表,Has
最近写爬虫需要降低内存的占用,现在用的是HashSet进行已爬URL的过滤,所以想到用布过滤器(Bloom Filter)来替换,从而减少内存的开销。因为HashSet内部是由HashMap处理的,HashMap则通过计算一个int型的hash值得出信息指纹,所以一个信息指纹占4字节,但是由于哈希的存储效率一般只有一半,所有说一条URL就需要8字节的信息指纹,而Bloom Filter 则只需要
介绍过滤器是指通过维护一张散列表对数据进行校验从而快速判定该数据是否存在于表中。在实际应用场景中主要用于预防恶意缓存击穿,一般在频繁查询的场景下,若大量恶意数据强行进行查询则会导致数据库和服务器压力过大,所有在查缓存之前往往会查询一下过滤器验证此数据是否是原数据库中存在的有效数据。 既然涉及到哈希算法就势必会有哈希碰撞,而碰撞结果往往会导致过滤器的数据误判(将不存在的数据误判定为存在)
对于广大程序员来说,“判断一个值是否存在”这么一个问题,可能新手会说遍历(数组),老手们会直接抛下一句“哈希表呗”然后不屑的离开。但是经过我们源码的分析可知,HashMap的判断,摊还分析确实是O(1)搜索时间,但是实际上就找到对应节点的过程(可以看我前面的博客)还是需要一定的时间的。假设我们构造好了链表之后,某一个位置的链表长度为7(嘿嘿,如果是8就是红黑树了,需要3次搜索),那么我们每一次判断
目录一. 情景导入二. bit数组2.1 数组介绍2.2 数组构建2.3 bit数组详解三. 过滤器3.1 过滤器介绍3.2 过滤器 的参数详解3.2.1 对bit数组大小m 的探究3.2.2 对哈希函数个数k 的探究 四. 过滤器的几个公式五. 总结一. 情景导入假设有这么一种情景:你是一家负责做浏览器的公司,对于某些不健康的网址,你希望你能够在用户访问这些网址时,弹出
蘑菇先生背景介绍Bloom filter(后面简称BF)是Bloom在1970年提出的二进制向量数据结构。通俗来说就是在大数据集合下高效判断某个成员是否属于这个集合。BF其优点在于:插入和查询复杂度都是O(n)空间利用率极高。例子1:像Yahoo这类的公共邮件服务提供商,总是需要过滤垃圾邮件。 假设有50亿个邮件地址,需要存储过滤的方法有:所有邮件地址都存储到数据库。缺点:每次都需要查询数据库,效
我们前面有讲到过 HyperLogLog 可以用来做基数统计,但它没提供判断一个值是否存在的查询方法,那我们如何才能查询一个值是否存在于海量数据之中呢?如果使用传统的方式,例如 SQL 中的传统查询,因为数据量太多,查询效率又低有占用系统的资源,因此我们需要一个优秀的算法和功能来实现这个需求,这是我们今天要讲的——过滤器。开启过滤器在 Redis 中不能直接使用过滤器,但我们可以通过
什么是过滤器本质上过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。实现原理HashMap 的问题讲述过滤器的原理之前,我们先思考
文章目录过滤器(BloomFilter)——原理(二)1. HashSet、HashMap数据结构简介2. BloomFilter的结构3. 关于BloomFliter一些疑惑的解释 过滤器(BloomFilter)——原理(二)1. HashSet、HashMap数据结构简介为了方便对比,所以我们先来看一下实现同类功能、常用的集合框架。因为HashSet一般由value为同一个Obje
从上一篇可以得知,BloomFilter的关键在于hash算法的设定和bit数组的大小确定,通过
# Redis过滤器使用指南 ## 简介 在本篇文章中,我将向你介绍如何使用Redis过滤器。Redis过滤器是一种高效的数据结构,用于快速判断一个元素是否存在于一个大集合中。这种数据结构可以用于减少数据库查询次数,提高系统性能。 在开始之前,请确保你已经安装好Redis,并且已经熟悉Redis的基本操作和命令。 ## 整体流程 下面是使用Redis过滤器的整体流程: |
原创 2023-08-17 11:48:38
41阅读
过滤器(Bloom Filter)是1970年由提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。代码实现://bitMap.h class BitMap { public: BitMap() {} BitMap(size_
  • 1
  • 2
  • 3
  • 4
  • 5