应用场景

去重

诞生背景

Java应用一般通过JDK自身提供的HashSet去重,通过contains()方法判断当前元素是否存在于Set中。该方式要求在调用contains()前,已经将数据列表加载到内存中(即该方法基于内存存储实现判断功能)。

        缺点:

1.满足不了分布式环境下的判重

2.高并发产生大数据量的情况下,此种方式容易OOM

简介

        布隆过滤器的初始化

        需要设计并构造K个哈希函数及容量大小为N、每个元素初始取值为0的位数组

        往其中添加元素

当使用布隆过滤器添加 key 时,会使用不同的 hash 函数对 key 存储的元素值进行哈希计算,从而会得到多个哈希值。根据哈希值计算出一个整数索引值,将该索引值与位数组长度做取余运算,最终得到一个位数组位置,并将该位置的值变为 1

        判断元素是否存在及误判原因

        将当前的元素经过K个哈希函数计算得到K个哈希值,然后判断K个哈希值(数组的下标)对应数组中的取值是否为1(若为1则一定存在);反之,则不一定存在。What???
        误判原因:比如,元素1 和 元素2,这两个元素同时将一个位置变为了 1(如下图所示)。在这种情况下,我们就不能判定“元素 1”一定存在,这是布隆过滤器存在误判的根本原因。

        优缺点分析

优点在于它不需要开辟额外的内存存储元素,从而节省了存储空间;缺点在于判断元素是否在集合中时,有一定的误判率,并且添加进布隆过滤器的元素是无法删除的,因为位数组的下标是多个元素“共享”的,如果删除的话,很有可能出现“误删”的情况。

代(上)码(菜)

基本数据类型

    public void testBaseBloom() {//定义Redis中的Keyfinal String key = "myBloomFilterBaseData";//初始化构造数组容量的大小Long total = 100L;//创建布隆过滤器组件RBloomFilter<Integer> bloomFilter = redissonClient.getBloomFilter(key);//初始化布隆过滤器,预计统计元素数量为100,期望误差率为0.01bloomFilter.tryInit(total, 0.01);//初始化遍历往布隆过滤器添加元素for (int i = 1; i <= total; i++) {bloomFilter.add(i);}//检查特定的元素在布隆过滤器中是否存在并打印输出log.info("该布隆过滤器是否包含数据1:{}", bloomFilter.contains(1));log.info("该布隆过滤器是否包含数据-1:{}", bloomFilter.contains(-1));log.info("该布隆过滤器是否包含数据100:{}", bloomFilter.contains(10000));log.info("该布隆过滤器是否包含数据100000:{}", bloomFilter.contains(100000));}

包装数据类型

    public void testDtoBloom(){//定义Redis中的Keyfinal String key="myBloomFilterDtoData";//创建布隆过滤器组件RBloomFilter<BloomDto> bloomFilter=redissonClient.getBloomFilter(key);//初始化布隆过滤器,预计统计元素数量为1000,期望误差率为0.01bloomFilter.tryInit(1000, 0.01);//初始化遍历向布隆过滤器中添加对象BloomDto dto1=new BloomDto(1, "1");BloomDto dto2=new BloomDto(10, "10");BloomDto dto3=new BloomDto(100, "100");BloomDto dto4=new BloomDto(1000, "1000");BloomDto dto5=new BloomDto(10000, "10000");//向布隆过滤器中添加对象bloomFilter.add(dto1);bloomFilter.add(dto2);bloomFilter.add(dto3);bloomFilter.add(dto4);bloomFilter.add(dto5);//检查特定的元素在布隆过滤器中是否存在并打印输出log.info("该布隆过滤器是否包含数据(1, \"1\"):{}", bloomFilter.contains(newBloomDto(1, "1")));log.info("该布隆过滤器是否包含数据(100, \"2\"):{}", bloomFilter.contains(new BloomDto(100, "2")));log.info("该布隆过滤器是否包含数据(1000, \"3\"):{}", bloomFilter.contains(new BloomDto(1000, "3")));log.info("该布隆过滤器是否包含数据(10000, \"10000\"):{}", bloomFilter.contains(new BloomDto(10000, "10000")));}

Redisson_布隆过滤器相关推荐

  1. Redis 预防缓存穿透“神器” — 布隆过滤器

    1. 布隆过滤器 1.1 概念 在架构设计时有一种最常见的设计被称为布隆过滤器,它可以有效减少缓存穿透的情况.其主旨是采用一个很长的二进制数组,通过一系列的 Hash 函数来确定该数据是否存在. 布隆 ...

  2. 算法:详解布隆过滤器的原理、使用场景和注意事项@知乎.Young Chen

    算法:详解布隆过滤器的原理.使用场景和注意事项@知乎.Young Chen 什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data struc ...

  3. C++拾取——Linux下实测布隆过滤器(Bloom filter)和unordered_multiset查询效率

    布隆过滤器是一种判定元素是否存在于集合中的方法.其基本原理是使用哈希方法将数据映射到一个很长的向量上.在维基百科上,它被称为"空间效率和查询时间都远远超过一般的算法"的方法.由于它 ...

  4. 布隆过滤器 redis_使用基于 Redis 的 Java 布隆过滤器

    (给数据分析与开发加星标,提升数据技能) 转自:ImportNew 布隆过滤器是一种概率数据结构,用来高效地测试集合中是否存在某个元素.使用布隆过滤器有助于减少在磁盘中查找键值的次数,从而降低开销. ...

  5. 过滤请求绝技,布隆过滤器与布谷鸟过滤器

    欢迎关注方志朋的博客,回复"666"获面试宝典 大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们 ...

  6. Redis 之布隆过滤器与布谷鸟过滤器

    欢迎关注方志朋的博客,回复"666"获面试宝典 大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们 ...

  7. 从bitmap到布隆过滤器,再到高并发缓存设计策略

    点击关注公众号,Java干货及时送达 作者:that_is_cool blog.csdn.net/that_is_cool/article/details/91346356 前言:怎么能把风马牛不相及 ...

  8. 牛逼哄哄的布隆过滤器,到底有什么用?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 原文:www.cnblogs.com/CodeBear/p ...

  9. mysql布隆过滤器源码_通过实例解析布隆过滤器工作原理及实例

    布隆过滤器 布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 "一定不存在或者可能存在& ...

最新文章

  1. 字符间距加宽5磅怎么设置_11层以下住宅小区——消防车道设置及答疑
  2. linux 虚拟仪器,linux平台下编写虚拟仪器系统设计
  3. 中西方对时间的差异_中西方时间观念差异 英文
  4. Android 工程师如何快速学会web前段
  5. python自动化之djangoform表单验证
  6. Express + TypeScript开发微信应用
  7. 1.nodejs介绍
  8. 简析三星新专利,语音识别技术的新方法
  9. 【编译器】Mac下gcc环境配置折腾
  10. python批量将文件夹下所有图片中一种颜色改变为随机颜色
  11. hbase中的master启动后自动关闭
  12. dx绘制2d图像_【3D建模】聊聊2D动画软件
  13. word表格三线表线宽度
  14. iso硬盘安装 凤凰os_phoenix os安装全教程 凤凰系统进不去安装注意事项
  15. django打开html页面跳转,django创建最简单HTML页面跳转方法
  16. VScode+Latex (Recipe terminated with fatal error: spawn xelatex ENOENT)和latex简单使用介绍
  17. java入门123 pdf下载_Java入门123:一个老鸟的Java学习心得 pdf_IT教程网
  18. 一篇文章彻底弄懂零拷贝底层原理
  19. 信号与系统之信号的时域分析
  20. Elegy written in a country church-yard

热门文章

  1. Android 事件传递机制总结
  2. event.button
  3. 设计原则之迪米特法则详解
  4. Android 项目必备(二十七)-->加密和解密
  5. 整理玩具 第九届蓝桥杯决赛第四题 java实现
  6. 笔记本蓝牙崩溃、图标消失不能打开蓝牙功能-解决办法(由于蓝牙串口连接出现的问题)
  7. C# 中SqlTransaction--启动事务 先删除从表,再删除主表
  8. 热评云厂商:坚果云0.65亿元,继续推进云存储业务,提振在即
  9. 记录一下身份证是否有效的验证方法
  10. 关于“reset high speed USB device using ehci_hcd and address 2”