Redis教程(十九):Redis的Redisson布隆过滤器

传送门:Redis教程汇总篇,让你从入门到精通

布隆过滤器

布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于快速检测一个元素是否存在于一个集合中。由于其独特的特性,布隆过滤器可以在需要节省空间且可以接受一定误判率的场合下,非常有效地使用。

 

核心特点

 
  1. 空间效率和查询时间:与传统的列表或散列表相比,布隆过滤器使用远少的空间和恒定的时间来检测元素是否存在。
  2. 概率型结构:布隆过滤器有一定的误判率(False Positive),即它可能会错误地认为某个不存在的元素存在于集合中。但它可以保证,如果它说某个元素不存在,那么这个元素一定不存在于集合中。
  3. 不可删除:一旦元素被加入布隆过滤器,就不能从中删除。这是因为布隆过滤器的实现机制导致无法区分哪些位是由于某个特定元素而置位的。不过,有一些变种实现(如Counting Bloom Filter)允许删除元素。
 

实现原理

 

布隆过滤器的内部是一个很大的位数组和几个哈希函数。工作原理如下:

 
  1. 初始化时,位数组所有位都设置为0。
  2. 添加元素时,将元素通过所有哈希函数映射到一系列位置,并将位数组对应位置置为1。
  3. 检查元素是否存在时,同样通过所有哈希函数计算元素的位置,如果所有位置都是1,认为元素可能存在;如果任一位置为0,则元素一定不存在。
 

使用场景

 

由于其特性,布隆过滤器经常被用于那些不要求100%精确性,但对空间和时间效率有高要求的场合。例如:

 
  • 网络爬虫中避免重复抓取同一URL;
  • 缓存穿透问题的解决方案中,快速判断请求的数据是否一定不存在;
  • 分布式系统中判断一个元素是否在一个很大的数据集合中,以减少对数据库的直接访问。
 

布隆过滤器是一种非常有用的数据结构,特别是在处理大量数据且可以接受低错误率的场景下。然而,使用时需要仔细选择哈希函数的数量和位数组的大小,这些参数直接影响到误判率和空间效率。

代码实现

package com.single.test;import org.redisson.Redisson;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;import java.util.ArrayList;
import java.util.List;/*** @program: RedisDemo* @description:* @author: fudingwei* @create: 2024-05-22 16:29**/
public class BloomTest {public static void main(String[] args) {Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");//看门狗设置锁超时时间//config.setLockWatchdogTimeout(30000);//得到redisson对象RedissonClient redisson = Redisson.create(config);RBloomFilter<String> bloom = redisson.getBloomFilter("name");// 初始化布隆过滤器;  大小:100000,误判率:0.01//误判率设置的越低,占用的内存大小越大,查询和插入的速度也会随之降低,这是一个取舍的问题bloom.tryInit(100000L, 0.01);// 新增10万条数据for(int i=0;i<100000;i++) {bloom.add("name" + i);}// 判断不存在于布隆过滤器中的元素List<String> ExistList = new ArrayList<>();for(int i=0;i<100000;i++) {String str = "apple" + i;boolean Exist = bloom.contains(str);if (Exist) {ExistList.add(str);}}if (ExistList.size() > 0 ) {System.out.println("误判次数:"+ExistList.size());}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/21378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.盒模型及其应用(溢出、外边距塌陷)

一、盒模型 盒模型详解-CSDN博客 CSS学习笔记3&#xff1a;CSS三大特性、盒子模型-CSDN博客 1.盒模型组成 &#xff08;1&#xff09;padding padding和border都会撑大盒子&#xff0c;margin不会. 如果没有指定盒子的width/height&#xff0c;那么padding不会撑大盒子。 &am…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:公路智能巡检解决方案

项目背景 中国公路网络庞大&#xff0c;总里程超过535万公里&#xff0c;高速公路里程位居世界前列。面对基础设施存量的不断增长&#xff0c;公路养护管理已迈入“建管养并重”的新时代。随着养护支出的逐年攀升&#xff0c;如何提升养护效率、降低管理成本&#xff0c;成为亟…

YOLOv10:实时端到端目标检测的新突破

目标检测作为计算机视觉领域的一个核心问题&#xff0c;其关键在于能够在图像中准确识别并定位对象。随着深度学习技术的发展&#xff0c;基于深度神经网络的目标检测方法不断涌现&#xff0c;其中YOLO&#xff08;You Only Look Once&#xff09;系列算法以其优异的实时性和准…

推荐几个开源的c#的工作流引擎组件

以下是一个.NET Core领域可以推荐使用的流程引擎的表格&#xff1a; 名称 生产厂家 下载地址 支持二开 独立部署 ccflow 济南驰骋信息技术有限公司 https://gitee.com/opencc 是 是 Elsa Elsa Workflows GitHub - elsa-workflows/elsa-core: A .NET workflows li…

C++类和对象下篇

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;[C] &#x1f4a8;路漫漫其修远兮 吾将而求索 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 文章目录 &#x1f4d4;1、再谈构造函数&#x1f4f0;…

使用 el-autocomplete 实现远程搜索功能

在现代Web应用中&#xff0c;提供高效且用户友好的搜索体验至关重要。Element UI&#xff08;一个为Vue.js设计的桌面端UI框架&#xff09;中的el-autocomplete组件正是为了满足这一需求而设计的&#xff0c;它能够实现自动补全与异步搜索功能。本文将通过一个示例来介绍如何使…

【C++】类和对象——构造和析构函数

目录 前言类的六个默认构造函数构造函数1.构造函数的概念2.构造函数的特性 初始化列表1.构造函数整体赋值2.初始化列表 析构函数1.析构函数的概念2.析构函数的特性 前言 类和对象相关博客&#xff1a;【C】类和对象   我们前面一个内容已经讲了关于类好对象的初步的一些知识&…

Python量化交易学习——Part5:通过相关系数选择对收益率影响比重大的因子(1)

上一节中我们学习了如何通过单因子策略进行股票交易,在实际的股市中,因子(也就是指标)数量往往非常之多,比如市盈率/市净率/净资产收益率等,在使用这些因子的过程中,我们会发现有的因子与收益率为正相关,有的因子为负相关,而有些因子几乎完全无关。 所以我们可以通过计…

k8s笔记——kubernetes中的三种IP

kubernetes概念 Master&#xff1a;集群控制节点&#xff0c;每个集群需要至少一个master节点负责集群的管控 Node&#xff1a;工作负载节点&#xff0c;由master分配容器到这些node工作节点上&#xff0c;然后node节点上的docker负责容器的运行 Pod&#xff1a;kubernetes的…

JS-10-es6常用知识-对象扩展

目录 1 Object.assign&#xff1a;实现拷贝继承 2 扩展运算符(...) 1&#xff09;介绍 2&#xff09;数组中的扩展运算符 3&#xff09;对象中的扩展运算符 1 Object.assign&#xff1a;实现拷贝继承 1&#xff09;目的&#xff1a;Object.assign()方法在 JavaScript 中被…

Java线程中sleep()和wait()有什么区别

在Java线程中&#xff0c;sleep()和wait()是两个经常被提及但功能和使用场景完全不同的方法。以下是它们之间的主要区别&#xff1a; 所属类和用途&#xff1a; sleep() 是 Thread 类的一个静态方法&#xff0c;它用于使当前线程&#xff08;即调用 sleep() 的线程&#xff0…

C++访问越界

常见场景 访问数组元素越界vector容器访问等 vector<int>;vec<2>&#xff1b;字符串访问越界string str;str[2];array数组访问越界字符串处理&#xff0c;没有添加’\0’字符&#xff0c;导致访问字符串的时候越界了&#xff1b;使用类型强转&#xff0c;让一个大…

Flutter开发效率提升1000%,Flutter Quick教程之定义构造参数和State成员变量

一个Flutter页面&#xff0c;可以定义页面构造参数和State成员变量。所谓页面构造参数&#xff0c;就是当前页面构造函数里面的参数。 比如下面代码&#xff0c;a就是构造参数&#xff0c;a1就是State成员变量。 class Testpage extends StatefulWidget {String a;const Test…

docker学习--docker容器镜像常用命令大全(简)

文章目录 一、镜像命令二、容器管理命令 一、镜像命令 docker search #搜索镜像 docker pull/push #下载/上传镜像 docker images #查看所有本地主机上的镜像可以使用docker image ls代替 docker tag #源镜像名 新镜像名 docker rmi #删除镜像 docker image prune #移除没有标签…

Python的文件管理

读取文件 首先我们可以先创建一个工程项目&#xff0c;如图所示&#xff1a; 打开我们名为1.读取文件.py的python文件&#xff0c;然后我们可以写下读取Python文件的代码&#xff0c;代码如下&#xff1a; f open("1.txt", "r") print(f.read()) f.clos…

【PB案例学习笔记】-14使用次数和日期限制

写在前面 这是PB案例学习笔记系列文章的第14篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

基于OLED菜单显示

菜单一般需要四个按键&#xff0c;上下移动光标&#xff0c;进入菜单&#xff0c;退出菜单 1.按键部分 按键头文件 #ifndef __KEYdriver_H #define __KEYdriver_H #include "sys.h" #include "stdbool.h" /*用户定义的宏开始*/ #define CursorUp PCi…

边缘计算、云计算、雾计算在物联网中的作用

边缘计算和雾计算不像云那样广为人知&#xff0c;但可以为企业和物联网公司提供很多帮助。这些网络解决了物联网云计算服务无法解决的许多问题&#xff0c;并使分散的数据存储适应特定的需求。让我们分别研究一下边缘计算、雾计算和云计算的优势。 雾计算的好处 低延迟。雾网络…

【工具】探索 ARPU:平均每用户收入

缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 &#x1f3b5; 邓紫棋《光年之外》 什么是 ARP…

UE5.1_常用快捷键

UE5.1_常用快捷键 shift1&#xff0c;&#xff0c;模式选择 shift2&#xff0c;&#xff0c;模式选择 shift3&#xff0c;&#xff0c;模式选择 shift4&#xff0c;&#xff0c;模式选择 shift5&#xff0c;&#xff0c;模式选择 shift6&#xff0c;&#xff0c;模式选择 …