首页 > 其他分享 >初识布隆过滤|工作场景

初识布隆过滤|工作场景

时间:2024-07-04 12:29:31浏览次数:19  
标签:hash redis 布隆 初识 过滤 import 过滤器 org

作用

检查一个元素是否在一个集合中

优缺点

优点:空间效率和查询时间比一般算法好,时间复杂度低,O(k) k是函数的个数,节省空间

缺点:有一定的错误几率,没有的也可能判定为存在,删除困难,无法获得参数本身

场景

  1. 解决Redis缓存穿透问题
  2. 邮件过滤,使用布聋过滤器来做邮件黑名单过滤
  3. 堆爬虫网址进行过滤
  4. 解决新闻推荐过的不再推荐,类似刷过的抖音下次刷不到
  5. 大数据量去重

原理

redis中的布隆过滤器底层由一个大型位数组(二进制数组)+多个无偏hash函数组成

(多个无偏位hash函数就是能把元素的hash值计算的比较均匀的hash函数)

当一个元素进入到布隆过滤器中的时候会使用多个无偏位hash函数分别计算hash,然后通过hash值来取模数组长度,得到数组索引。当查询一个元素是否存在的时候就对这个元素进行hash然后查看对应多个二进制数组地址是否值为1

空间计算

布隆过滤器的三个参数

  • 元素的大小n
  • 运行的错误率f
  • 无偏hash函数的个数k

免费计算布隆过滤器的在线地址(通过元素个数,hash函数,准确率计算出所占用的空间大小) https://krisives.github.io/bloom-calculator/

增加元素流程

1.通过k个无偏hash函数计算得到k个hash值

2.依次取模数组长度,得到数组索引

3.将计算得到的数组索引下表位置数据修改为1

Java集成Redis使用布隆过滤器

  1. 引入redisson框架
<!--redisson框架引入-->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.16.0</version>
</dependency>
  1. 编写代码
package com.zhaoxy.springbootredis;

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.redisson.Redisson;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;


@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootRedisApplication.class)
class SpringbootRedisApplicationTests {

    /** 预计插入的数量 **/
    private static final Integer expectedInsertions = 1000;
    /** 误判率 */
    private static final Double fpp = 0.01;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;



    @Test
    public void testSet() {
        redisTemplate.boundValueOps("name").set("zhangsan");
    }

    @Test
    public void testBuloomFilter() {
        //redis连接
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        config.useSingleServer().setPassword("123456");
        //初始化布聋过滤器
        RedissonClient client = Redisson.create(config);
        RBloomFilter<Object> bloomFilter = client.getBloomFilter("user");
        bloomFilter.tryInit(expectedInsertions,fpp);

        //布隆过滤器增加元素
        for (Integer i = 0; i < expectedInsertions; i++) {
            bloomFilter.add(i);
        }
        //统计元素
        int count = 0;
        for (Integer i = expectedInsertions; i < expectedInsertions*2; i++) {
            if(bloomFilter.contains(i)){
                count++;
            }
        }
        System.out.println("误判次数"+count);

    }
}

【程序员都必须会的技术,面试必备【布隆过滤器详解】,Redis缓存穿透解决方案】https://www.bilibili.com/video/BV1zK4y1h7pA?vd_source=40f864ed61303be63434eb6a5f73e297

使用场景

  • 用户注册场景

    • 用户量过大的情况下,注册的时候需要判断用户名是否重复,初始化的时候将用户名存到布隆过滤器中,注册的时候先到布隆过滤器中查询,如果存在就代表可能存在这个用户名,用户更换名字注册公共后将新的名字注入到布隆过滤器中
    • 以上场景存在一个问题,那就是如果用户注销掉了布隆过滤器还是有这个人的名字。可以加一层redis的set类型的注销用户集合,当用户注销的时候加入set,当判断布隆过滤器可能存在用户名后在到redis的set集合中查找一下,如果存在则让他继续注册移除redis中set集合中的用户名。

    image-20240623113340072

标签:hash,redis,布隆,初识,过滤,import,过滤器,org
From: https://blog.csdn.net/weixin_45948874/article/details/140176235

相关文章

  • 解锁Diffusion Model: 初识Stable Diffusion、DALL-E、Imagen!
    前言扩散模型在生成高质量图像、视频、声音等方面表现突出。它们与物理学中的自然扩散过程相似而得名,自然扩散过程描述了分子如何从高浓度区域移动到低浓度区域。在机器学习的背景下,扩散模型通过逆转扩散过程来生成新数据。主要的思想是向数据添加随机噪声,然后反过来从噪声......
  • 使用Filter接口编写过滤器解决post乱码
    在使用tomcat9以及之前的版本,request-character-encoding和response-character-encoding使用的字符编码默认不是utf-8,所以导致前端发送到后台的中文乱码.如果使用的是tomcat10以及之后的版本,在apache-tomcat-10.1.25\conf\web.xml已设置好默认的字符集编码为utf-8,如果所示:......
  • 基于C++类与权限初识:银行系统
    功能:银行的账户是一个模板,是一个类,有存款人信息和账户额度,而具体的存款人视为一个对象,一个对象不能私自修改账户额度,需要通过一个操作流程,比如去ATM或者柜台进行操作才能修改到账户额度,所以,存款人信息和账户额度设计成私有权限,通过公有的操作流程,也就是公有函数去操作私有......
  • 【hash】hash算法、hash函数、哈希表、布隆过滤器、一致性哈希
    哈希函数的基本性质函数定义域是无穷的,值域相对有限(但也很大,比如2的64次方)输入同样样本一定得到同样的输出输入不同样本可能得到相同输出,此时叫哈希碰撞输入大量不同的样本,得到大量输出值,会几乎均匀的分布在整个输出域上布隆过滤器通过几个不同哈希函数计算哈希值,对位......
  • 仿论坛项目--初识Spring Boot
    1.技术准备技术架构•SpringBoot•Spring、SpringMVC、MyBatis•Redis、Kafka、Elasticsearch•SpringSecurity、SpringActuator开发环境•构建工具:ApacheMaven•集成开发工具:IntelliJIDEA•数据库:MySQL、Redis•应用服务器:ApacheTomcat•版本......
  • 【Java面试场景题】如何设计一个敏感词过滤系统?
    一、问题解析下图是一个完整的文本审核流程,包括名单匹配、敏感词匹配、AI机器审核、人工审核四个环节。待审核文本需要顺次通过名单匹配、敏感词匹配、AI机器审核三个流程,若结果为嫌疑则需要人工审核,否则将直接给出确定的结果。敏感词匹配功能可以迅速地匹配文本中的敏感词汇......
  • 基于SpringBoot+Vue邮件过滤系统设计和实现(源码+LW+调试文档+讲解等)
    ......
  • Hadoop权威指南-读书笔记-01-初识Hadoop
    Hadoop权威指南-读书笔记记录一下读这本书的时候觉得有意思或者重要的点~第一章—初识HadoopTips:这个引例很有哲理嘻嘻......
  • 基于SpringBoot+大数据+协同过滤推荐算法的电商商品推荐系统设计和实现(源码+LW+部署
    博主介绍:✌全网粉丝50W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、P......
  • 基于SpringBoot+数据可视化+协同过滤算法的个性化视频推荐系统设计和实现(源码+LW+部
    博主介绍:✌全网粉丝50W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、P......