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

redis中使用bloomfilter判断元素是否存在

一 bloomfiler的作用

1.1 bloomfilter的作用

由一个初始值为0的bit数组组成,和多个hash函数构成,用来判断集合中是否存在某个元素。

一个很长的二进制数组(00000000)+一系列随机hash算法映射函数。主要用于判断一个元素是否存在集合中。

本质:判断一个数据是否存在一个大的集合中。有,可能有,无则一定没有

1.2 bloomfilter的原理

 1.3 使用场景

一般情况下,先查询缓存redis是否有该条数据,缓存中没有时,再查询数据库。当数据库也不存在该条数据时,每次查询都要访问数据库,这就是缓存穿透。缓存透带来的问题是,当有大量请求查询数据库不存在的数据时,就会给数据库带来压力,甚至会拖垮数据库。

可以使用布隆过滤器解决缓存穿透的问题。

1.4 hash值存储计算

散列函数的输入和输出并不是唯一的对应关系,如果两个散列值相同,两个输入值是相同的,也可能不是不同的。被称为hash碰撞。

public class Hset {public static void main(String[] args) {Set<Integer> st=new HashSet<>();int hcode=0;for(int k=0;k<200000;k++){hcode=new Object().hashCode();if(st.contains(hcode)){System.out.println("hash冲突:"+k);}st.add(hcode);}}

结果

 1.5 使用过滤器的步骤

1.初始化bitmap

默认为长度为m的值为0的bit位数组。

2.添加占坑位

为了尽量地址不发生冲突,会使用多个hash函数对key进行运算,算得一个下标索引值,然后对位数组长度进行取模运算得到一个位置,每个hash函数都会算得一个不同的位置,再把位数组的这个几个位置都设置为1,完成add操作。即 对字符串进行多次hash(key)-》取模运算-得到坑位。

3.判断是否存在

查询时,先把这个key通过相同的多个hash函数进行运算,查看对应的位置是否为1;只要有一个位为0,那么说明布隆过滤器中的这个key不存在。如果这几个位置全都是1,那么说明可能存在。

http://www.lryc.cn/news/98333.html

相关文章:

  • 互联网医院系统源码实现:打造现代化医疗服务平台
  • 每天100w次登陆请求, 8G 内存该如何设置JVM参数?
  • Fiddler Everywhere(TTP调试抓包工具) for Mac苹果电脑版
  • Paragon NTFS2023最新版Mac读写NTFS磁盘工具
  • vs2013 32位 编译的 dll,重新用vs2022 64位编译,所遇问题记录
  • Linux_CentOS_7.9部署Docker以及镜像加速配置等实操验证全过程手册
  • 强引用和弱引用
  • tp6 实现excel 导入功能
  • 【C++】类和对象(中篇)
  • 大数据处理架构详解:Lambda架构、Kappa架构、流批一体、Dataflow模型、实时数仓
  • 双指针解决n数之和问题
  • 安全学习DAY07_其他协议抓包技术
  • electron的electron-packager打包运行和electron-builder生产安装包过程,学透 Electron 自定义 Dock 图标
  • 【无标题】深圳卫视专访行云创新马洪喜:拥抱AI与云原生,深耕云智一体化创新
  • jenkins通过流水线进行构建jar包
  • Android开发:通过Tesseract第三方库实现OCR
  • 合并两个有序链表——力扣21
  • 企业数据,大语言模型和矢量数据库
  • LabVIEW使用支持向量机对脑磁共振成像进行图像分类
  • kafka面试题
  • 树的遍历(一题直接理解中序、后序、层序遍历,以及树的存储)
  • JVM系统优化实践(22):GC生产环境案例(五)
  • DevOps系列文章 之GitLabCI模板库的流水线
  • spring扩展点ApplicationContextAware解释
  • 力扣热门100题之最大子数组和【中等】【动态规划】
  • 导出为PDF加封面且分页处理dom元素分割
  • 【C++入门】浅谈类、对象和 this 指针
  • 【Linux命令200例】indent对C语言代码进行缩进和格式化
  • Hive 调优集锦(1)
  • 【C++详解】——智能指针