Redis——布隆净化器

原创
小哥 3年前 (2022-11-09) 阅读数 7 #大杂烩
  1. 安装使用

    • rebloom作为插件安装 centos安装rebloom
    • docker安装:

      // 拉取镜像 docker pull redislabs/rebloom // 后台运行,映射到本地6380端口 docker run -d -p 6380:6379 redislabs/rebloom // 连接 redis-cli -p 6380

  2. Bloom滤波器的主要阶数和误判

    • bf.add: 语法:[bf.add key value] 返回1添加成功
    • bf.exists: 语法:[bf.exists key value] 返回1表示存在
    • madd, mexists是加法和判断倍数value
      当Blom筛选器显示值存在时,该值可能不存在。;当它说它不存在时,它肯定不存在。
  3. 基本使用

        // 连接redis操作
        conn, err := redis.Dial("tcp", "127.0.0.1:6380")
        HandlecError(err, "connect")
        defer func() {
            _ = conn.Close()
        }()
    
        // 测试redisBloom过滤器
        res, err := conn.Do("bf.add", "reBloom", "user100")
        fmt.Println(res, err)
    
        res2, err2 := conn.Do("bf.exists", "reBloom", "user1")
        fmt.Println(res2, err2)
  4. go测试误判小实验

    // 每一代不同的key
    testKey := uuid.NewV4().String()
    
    // 对于那些已经被添加到Blom过滤器的人,他可以肯定地判断它存在(res=1)
    for i := 1; i < 100000 ; i++ {
        _, _ = conn.Do("bf.add", testKey, "user" + strconv.Itoa(i))
        res, _ = conn.Do("bf.exists", testKey, "user" + strconv.Itoa(i))
        if res.(int64) == 0{
            fmt.Println(i)
            break
        }
    }
    // 测试结果: 不会误判
    
    // 对于那些没有添加Blom过滤器的人,他可能会误判存在(res=1)
    for i := 1; i < 100000 ; i++ {
        _, _ = conn.Do("bf.add", testKey, "user" + strconv.Itoa(i))
        res, _ = conn.Do("bf.exists", testKey, "user" + strconv.Itoa(i + 1))
        if res.(int64) == 1{
            fmt.Println(i)
            break
        }
    }
    // 测试结果: i=310就误判了

Blom过滤器可以自定义参数。,需要我们加入 add 之前使用 bf.reserve 指令是显式创建的。如果相应的 key 已经存在,bf.reserve 会报错。bf.reserve 有三个参数: 分别是 key, error_rate 和 initial_size错误率越低,所需空间越大。initial_size 该参数表示预期版本。 中的元素数量,当实际数量超过此值时,错误率会增加。

  1. 布隆过滤器原理
  • Blom过滤器的数据结构内部是一个大的位数组和几个不同的无偏(把元素的 hash该值相对均匀。) hash函数, 对每个key多次执行。hash
  • 添加到Blom筛选器 key 使用多个 hash 函数对 key 进行 hash 计算整数索引值, 然后对比特阵列的长度进行建模,以获得每个比特阵列的位置。 hash 该函数将计算不同的位置。然后设置位数组的这些位置1 就完成了 add 操作。
  • 询问Blom筛选器 key 无论是否存在,请遵循 add 同样,也将 hash 计算多个位置,以查看位阵列中的这些位置是否都是位。 1… 只要有一点 0,然后在Blom筛选器中对此进行解释 key不存在。如果全部 1,这并不意味着key 它必须存在,但它很可能存在,因为 某些位已设置 1 可能是因为其他原因 key 由于存在。
  1. Bloom Filter的应用场景
    • 推荐的内容不重。
    • 爬虫URL去重
    • 邮箱系统的垃圾邮件过滤
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除