当前位置: 首页 > news >正文

Redis 布隆过滤器

布隆过滤器

这一篇文章主要是记录布隆过滤器的使用和认识
主要参考了如下的blog
https://blog.csdn.net/weixin_42972832/article/details/131211665
他讲的还不错

简单的来说,布隆过滤器,实际上就像是一个集合,拿redis的key来举例来说,布隆过滤器的设置就是去过滤不属于redis key集合的key,这个方法还算挺有效的

原理初探

我理解到,布隆过滤器,底层就是利用hash函数

首先布隆过滤器一般是bitmap
传来一个key,通过几个hash函数,生成几个index的位置,
然后一个一个去查这几个index位置上的bitmap,是否都是1,如果都是1,那么就说明这个key存在于这个集合中,那我们就要放行

这里的算法其实应该是多种多样,但是万变不离其中,就是使用hash匹配
在这里插入图片描述

其实很好理解拉,不能懂!

问题

  • 误判的问题

这里学过hash函数的很容易想到,这里可能会发生hash碰撞,如果一个key,他刚好等于已经存在的key的hash的化,就会发生hash碰撞,这就是会发生误判的理由

但是可以知道的是,如果说,过滤之后不在集合里边,那么就说名集合里边一定没有这个key,这个原理大家基本都懂,hash一般是不可逆的,
布隆过滤器: 不存在一定不存在,存在有可能存在,有可能不存在,有误判的可能

  • 不能删除的问题

因为布隆过滤器底层是多个hash共享数组的位置的,所以如果说,我们要删除某个key的化,就会影响到别人,所以布隆过滤器就是不能删除,只能重构

由于重构引出的问题就是,有可能重构的成本太大了,你有1亿条数据要重构,这成本太高了

手动实现

我这里的手动实现也是参考他的博客来看的,算是最简单的

先来看工具类

import com.hmdp.filter.BloomFilterInit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class CheckUtils {@Autowiredprivate RedisTemplate redisTemplate;/*** 布隆过滤器校验** @param key* @return boolean* @author hc* @date 2023/6/15 11:42*/public boolean checkData(String key) {int abs = Math.abs(key.hashCode());long index = (long) (abs % Math.pow(2, 32));return redisTemplate.opsForValue().getBit(BloomFilterInit.WHITELIST_USER_KRY, index);}/*** 获取偏移量* @param key* @return long* @author hc* @date 2023/6/15 17:19*/public long getOffsetId(String key) {int abs = Math.abs(key.hashCode());return getIndex(abs);}/*** 计算偏移量** @param abs* @return java.lang.Long* @author hc* @date 2023/6/15 16:25*/public long getIndex(int abs) {if (0 == abs) {return 0L;}return (long) (abs % Math.pow(2, 32));}
}

因为这里使用最简单的方法,所以直接就用java的hashCode方法得到hash值,然后这里的bitmap 我的容量大小是2的32次方

看这个工具类,也很好理解
生成index,就是hash值 % 2 ^32

就是这里的checkData比较特殊一点,先是获得index的位置,然后去redis中的bitmap中查找,如果有返回true,没有返回false

controller 测试类

@RestController
@RequestMapping("/bloom")
public class BloomFilterController {@Autowiredprivate BloomFilterService bloomFilterService;@GetMapping("/add")public void addUser(String phone) {bloomFilterService.addUser(phone);}@GetMapping("/query/{id}")public void queryUser(@PathVariable Long id) {bloomFilterService.queryUser(id);}
}

一个添加用户
一个查用户

public interface BloomFilterService {void addUser(String phone);User queryUser(Long id);
}

实现类

@Slf4j
@Service
public class BloomFilterServiceImpl implements BloomFilterService {private static final String CACHE_KEY_USER = "user:";@Resourceprivate CheckUtils checkUtils;@Resourceprivate RedisTemplate redisTemplate;@Autowiredprivate IUserService userService;@Autowiredprivate RedisCache redisCache;public void addUser(String phone) {//返回idUser user = BeanUtil.copyProperties(UserDTO.builder().nickName("").build(), User.class);userService.save(user.setPhone(phone));// 这里可以开启一个异步线程,在事务提交之后再进行操作if (user.getId() > 0) {String key = CACHE_KEY_USER + String.valueOf(user.getId());//计算index位置long index = checkUtils.getOffsetId(key);// redis的数据都需要使用统一的json工具转成json格式后放入redisCache.setCacheObject(key,user);redisTemplate.opsForValue().setBit(BloomFilterInit.WHITELIST_USER_KRY, index, Boolean.TRUE);log.info("新增用户信息|用户key:{}|布隆过滤器偏移量:{}", key, index);}}public User queryUser(Long id) {if (id < 0) {log.info("获取用户信息|用户id异常,异常id:{}", id);return null;}String key = CACHE_KEY_USER.concat(String.valueOf(id));boolean checkData = checkUtils.checkData(key);if (!checkData) {log.info("获取用户信息|用户id不存在,异常id:{}", id);return null;}//布尔过滤通过了!User user = redisCache.getCacheObject(key);log.info("用户信息 {}",user);//如果他为空if(Objects.isNull(user)) {return null;}return user;}}

我来先说这里的addUser的逻辑

首先是直接到数据库中,存数据,这里的数据库的操作,可以自行换一个数据库,只要有id的就行

然后就是存redis的过程
先是获得redis的key 这里的key 拼接是这样 user: + id
然后是获得index的位置,这个也是bitmap中的index

存redis user用户
存redis bitmap 设置为1

queryUser

先是获得key,先去查布隆过滤器,布隆过滤器的checkData
这里的查找也是和设置bitmap的时候也是一样,就是去查找bitmap 在index位置是否是1
如果通过,说明集合里边有他,就说明成功

测试

先添加用户
在这里插入图片描述

redis的样子
在这里插入图片描述
然后我们去查1017是否存在

在这里插入图片描述

在这里插入图片描述
从这里看是存在的

我们再去查1000
是否存在
在这里插入图片描述
在这里插入图片描述
这样就实现了简单的布隆过滤器

总结

总结来看,我这个小布隆过滤器,只有2^32个位置,而且还只是看一位的,所以蛮粗糙的,但是不妨碍我们理解布隆过滤器,不管他多复杂,思想都是一样的,都要去做hash的运算,算位置,比较位置,就没了

相关文章:

Redis 布隆过滤器

布隆过滤器 这一篇文章主要是记录布隆过滤器的使用和认识 主要参考了如下的blog https://blog.csdn.net/weixin_42972832/article/details/131211665 他讲的还不错 简单的来说,布隆过滤器,实际上就像是一个集合,拿redis的key来举例来说,布隆过滤器的设置就是去过滤不属于redi…...

中国的茶文化:现代生活中的茶文化

中国的茶文化&#xff1a;现代生活中的茶文化 引言 在现代社会的快节奏生活中&#xff0c;茶文化并未随时间流逝而褪色&#xff0c;反而以其独特的方式融入了全球各地人们的日常生活。它超越了饮品本身的范畴&#xff0c;成为一种连接历史、人文与现代生活方式的艺术形式。本文…...

Python正则表达式语法

正则表达式是一种强大的文本处理工具&#xff0c;它可以用来搜索、匹配和替换特定的字符模式。在Python中&#xff0c;正则表达式常常被用于处理字符串数据&#xff0c;例如文本搜索、数据提取、格式验证等任务。本文将深入介绍Python中正则表达式的语法&#xff0c;帮助读者全…...

C++核心编程:文件操作 笔记

5.文件操作 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦允许结束都会被释放。通过文件可以将数据持久化 C中对文件操作需要包含头文件<fstream> 文件类型分为两种&#xff1a; 文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文本…...

ElementUI组件:Button 按钮

ElementUI安装与使用指南 Button按钮 点击下载learnelementuispringboot项目源码 效果图 el-button.vue页面效果图 项目里el-button.vue代码 <script> export default {name: "el_button",// 注意这里的名称不能和 router inex.js里的name一样methods: {s…...

#RAG|NLP|Jieba|PDF2WORD# pdf转word-换行问题

文档在生成PDF时,文宁都发生了什么。本文讲解了配置对象、resources对象和content对象的作用,以及字体、宇号、坐标、文本摆放等过程。同时,还解释了为什么PDF转word或转文字都是一行一行的以及为什么页眉页脚的问题会加大识别难度。最后提到了文本的编码和PDF中缺少文档结构标…...

solr的原理是什么

1 Java程序里如果有无限for循环的代码导致CPU负载超高&#xff0c;如何排查&#xff1f; 排查Java程序中由于无限循环导致的CPU负载过高的问题&#xff0c;可以按照以下步骤进行&#xff1a; 资源监控&#xff1a; 使用系统命令行工具&#xff08;如Linux上的top或htop&#xf…...

【安装指南】nodejs下载、安装与配置详细教程

目录 &#x1f33c;一、概述 &#x1f340;二、下载node.js &#x1f337;三、安装node.js &#x1f341;四、配置node.js &#x1f33c;一、概述 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时&#xff0c;用于构建可扩展的网络应用程序。Node.js 使用事件驱动、…...

Mobileye CES 2024 自动驾驶新技术新方向

Mobileye亮相2024年国际消费类电子产品展览会推出什么自动驾驶新技术? Mobileye再次亮相CES,展示了我们的最新技术,并推出了Mobileye DXP--我们全新的驾驶体验平台。 与往年一样,Mobileye是拉斯维加斯展会现场的一大亮点,让参观者有机会见证我们对自主未来的愿景。 在…...

【Linux】网络基本配置及网络测试、测试工具

一、网络基本配置 查看网络信息&#xff1a; ifconfigc / ip addr停止网卡eth0&#xff1a; ifconfig eth0 down在本地启动网卡eth0&#xff1a; ifconfig eth0 up改变网卡ip&#xff1a; ifconfig eth0 192.168. .修改子网掩码&#xff1a; ifconfig eth0 &#xff08;I…...

pnpm : 无法加载文件 D:\tool\nvm\nvm\node_global\pnpm.ps1,因为在此系统上禁止运行脚本

你们好&#xff0c;我是金金金。 场景 新创建的项目&#xff0c;在vscode编辑器终端输入 pnpm i&#xff0c;显示报错如上 解决 在终端输入get-ExecutionPolicy(查看执行策略/权限) 输出Restricted(受限的) 终端再次输入Set-ExecutionPolicy -Scope CurrentUser命令给用户赋予…...

Python 类与实例

在面向对象编程中&#xff0c;类&#xff08;Class&#xff09;是一种抽象的概念&#xff0c;它描述了对象的属性和行为。类可以看作是创建对象的蓝图或模板&#xff0c;它定义了一组属性和方法&#xff0c;并提供了创建对象的规范。 类包含了对象的属性和方法的定义&#xff…...

2的N次方

题目描述 输入n行&#xff0c;每行一个整数x&#xff0c;输出2的x次方的个位是多少&#xff1f;2的3次方表示3个2相乘&#xff0c;结果是8 输入 输入n行&#xff0c;每行一个整数x 输出 输出n行&#xff0c;每行一个整数&#xff0c;2的x次方的个位。 样例输入 Copy 5 4…...

cobra - 更容易地构建命令行应用

cobra 是什么 cobra 的主要功能是创建强大的现代 cli 应用程序。目前市面上许多的著名的 Go 语言开源项目都是使用 Cobra 来构建的&#xff0c;例如&#xff1a;K8s、Hugo、etcd、Docker 等&#xff0c;是非常可靠的一个开源项目。 没有 cobra 之前用什么 如果不用 cobra&am…...

windows10设置多个jar后台开机自启

1、window10启动多个jar包的脚本 新建一个txt文档&#xff0c;将以下内容复制到文档中&#xff1a; echo off taskkill /f /im javaw.exe //停用之前启动过的所有后台javaw程序 d: //jar包所在盘符 cd saas //jar包所在文件夹 start cmd /c "title 程序…...

数据库||数据库相关知识练习题目与答案

目录 1.只能读取本系学生的信息&#xff1f; 2.要查询选修“Computer”课的男生姓名&#xff0c;将涉及到关系&#xff08; &#xff09; 3.实体完整性规则规定&#xff08; &#xff09; 4.下列有关范式的叙述中正确的是&#xff08; &#xff09; 5.从课程表course&…...

YOLOv8改进 | 损失函数篇 | 更加聚焦的边界框损失Focaler-IoU、InnerFocalerIoU(二次创新)

一、本文介绍 本文给大家带来的改进机制是更加聚焦的边界框损失Focaler-IoU已经我进行二次创新的InnerFocalerIoU同时本文的内容支持现阶段的百分之九十以上的IoU,比如Focaler-IoU、Focaler-ShapeIoU、Inner-Focaler-ShapeIoU包含非常全的损失函数,边界框的损失函数只看这一…...

利用nginx宝塔免费防火墙实现禁止国外IP访问网站

本章教程&#xff0c;主要介绍&#xff0c;如何利用nginx宝塔面板中的插件免费防火墙&#xff0c;实现一键禁止国外IP访问网站。 目录 一、安装宝塔插件 二、 开启防火墙 一、安装宝塔插件 在宝塔面板中的软件商店&#xff0c;搜索防火墙关键词&#xff0c;找到Nginx免费防火…...

消息中间件(MQ)对比:RabbitMQ、Kafka、ActiveMQ 和 RocketMQ

前言 在构建分布式系统时&#xff0c;选择适合的消息中间件是至关重要的决策。RabbitMQ、Kafka、ActiveMQ 和 RocketMQ 是当前流行的消息中间件之一&#xff0c;它们各自具有独特的特点和适用场景。本文将对这四种消息中间件进行综合比较&#xff0c;帮助您在项目中作出明智的…...

MySQL索引原理以及SQL优化

案例 struct index_failure_t{int id;string name;int cid;int score;string phonenumber;}Map<int,index_failure>; 熟悉C的同学知道&#xff0c;上述案例中&#xff0c;我们map底层是一颗红黑树&#xff0c;一个节点存储了一对kv&#xff08;键值对&#xff09;&…...

构建可持续的阅读书源生态:从基础导入到高级管理策略

构建可持续的阅读书源生态&#xff1a;从基础导入到高级管理策略 【免费下载链接】Yuedu &#x1f4da;「阅读」自用书源分享 项目地址: https://gitcode.com/gh_mirrors/yu/Yuedu 在数字阅读日益普及的今天&#xff0c;阅读APP已成为广大书迷获取内容的重要渠道。然而&…...

Windows 11系统级优化:ExplorerPatcher核心技术深度解析与专业修复方案

Windows 11系统级优化&#xff1a;ExplorerPatcher核心技术深度解析与专业修复方案 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher Windows 11…...

nvm-setup安装步骤详解

nvm-setup是 Node Version Manager&#xff08;Node.js 版本管理器&#xff09;​ 的安装包。装了它&#xff0c;你就能在一台电脑上随时切换多个 Node.js 版本&#xff0c;做前端开发、跑不同项目的必备工具。一、准备工作安装包下载&#xff1a;https://wwbkk.lanzoub.com/iU…...

深度学习优化器原理与图像分类实战指南

1. 项目概述&#xff1a;为什么优化器不是“调参配菜”&#xff0c;而是图像分类器的“神经节律控制器”你训练一个ResNet-50做CIFAR-10分类&#xff0c;学习率设成0.1&#xff0c;用SGD跑50轮&#xff0c;测试准确率卡在87.3%&#xff1b;换Adam&#xff0c;同样0.1学习率&…...

专业级EdgeRemover配置指南:5种高效部署方案深度解析

专业级EdgeRemover配置指南&#xff1a;5种高效部署方案深度解析 【免费下载链接】EdgeRemover A PowerShell script that correctly uninstalls or reinstalls Microsoft Edge on Windows 10 & 11. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemover EdgeR…...

如何快速上手res-downloader:跨平台资源下载工具终极指南

如何快速上手res-downloader&#xff1a;跨平台资源下载工具终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 想要轻松…...

电机正反转深度解析

电机正反转本质&#xff1a;通过改变内部磁场或电枢电流方向&#xff0c;实现顺时针/逆时针旋转&#xff0c;是设备控制核心功能&#xff01; &#x1f4cc;核心原理(文字速记,新手好记)&#xff1a; ① 三相异步电机&#xff08;最常用&#xff09;&#xff1a;反转可通过任意…...

LivePortrait技术突破:企业级肖像动画生成与部署实战指南

LivePortrait技术突破&#xff1a;企业级肖像动画生成与部署实战指南 【免费下载链接】LivePortrait Bring portraits to life! 项目地址: https://gitcode.com/GitHub_Trending/li/LivePortrait 从静态到动态&#xff1a;如何用AI技术让肖像"活"起来 在数字…...

SEED-Lab7 XSS攻击实验(Elgg)

SEED-Lab7 XSS攻击实验(Elgg) 文章目录 SEED-Lab7 XSS攻击实验(Elgg)文章目录实验环境实验内容实验步骤DNS SetupTask 1: Posting a Malicious Message to Display an Alert WindowTask 2: Posting a Malicious Message to Display CookiesTask 3: Stealing Cookies from the…...

FactoryBluePrints项目深度解析:戴森球计划终极工厂蓝图优化指南

FactoryBluePrints项目深度解析&#xff1a;戴森球计划终极工厂蓝图优化指南 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints FactoryBluePrints项目是戴森球计划游戏中最为…...