Redis 布隆过滤器性能对比分析

redis 实现布隆过滤器实现方法:

1、redis 的 setbit 和 getbit

特点:对于某个bit 设置0或1,对于大量的值需要存储,非常节省空间,查询速度极快,但是不能查询整个key所有的bit,在一次请求有大量的值需要过滤的场景会出现多次请求getbit,性能会急剧下降,需要把多个gitbit合并成批次,使用lua脚本或者pipeline执行提高效率。

2、redis 的 BF.RESERVE,BF.MADD和 BF.MEXISTS

特点:redis 4.0 以上官方提供的一个插件,原生Bloom过滤器,参数包括 布隆过滤器的大小,误差率等,支持批量写入和批量查询,性能更优,针对一次大量请求,批量查询接口性能更快。

以上两种布隆过滤器性能测试结果对比:

硬件:单节点 redis,2G内存,2核cpu

测试条件:布隆过滤器容量都是 10000,容错率都是:0.001, 场景:一次请求需要过滤10000个id,每100个批量查询一次redis, 如此循环 10次。

序号redis setbit getbit(时延单位:毫秒)redis BF.RESERVE,BF.MADD和 BF.MEXISTS (时延单位:毫秒)
115561238
214751164
31734989
430341701
515321254
615791179
715411177
815671045
916981216
1016891275
平均1740.51223.8

3、基于以上的测试结果,如果一次推荐请求用户已经看过10000个视频,需要过滤10000个视频,时延会上涨到秒级以上,这样对于高并发情况性能是不行的,还有其他的办法嘛? 能不能一次性把整个布隆过滤器读到本地再进行过滤?

在推荐场景,布隆过滤器设置了容量5000个,容错率是0.001,布隆过滤器的最大值为:17972 byte,约 17K,如果每次写入和查询都查询整个布隆过滤器,1000qps 占用的网络带宽为: 13.92 Mbps。

测试可行性:本地构造一个布隆过滤器对象 BitSet,BitSet的最大值是int的最大,从redis查询出来序列化成BitSet对象,再进行读写操作,如果是写操作,再序列化写入redis。

private BitSet get(long userId) {String key = TestBloomP.getBitMapKey(userId, "111");log.info("get bitset key:{}", key);return (BitSet) redisTemplate.opsForValue().get(key);
}private void add(long userId, List<Long> filterItems) {BitSet bitSet = new BitSet();for (Long item : filterItems) {String uniqueKey = userId + ":" + item;List<Integer> offsets = TestBloomP.getOffsets(uniqueKey);for (Integer offset : offsets) {bitSet.set(offset);}}String key = TestBloomP.getBitMapKey(userId, "111");log.info("add bitset key:{}, size:{}", key, bitSet.size());redisTemplate.opsForValue().set(key, bitSet);
}

redis 使用java默认的序列化工具JdkSerializationRedisSerializer,测试结果 如下:写操作会先读再写 时延都是很低:

add bitset key:shop_video:filter_exposed:1607433260630157, size:143808, add count:1, time:36
get bitset time:9, bitset :143808

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

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

相关文章

240711_昇思学习打卡-Day23-LSTM+CRF序列标注(2)

240711_昇思学习打卡-Day23-LSTMCRF序列标注&#xff08;2&#xff09; 今天记录LSTMCRF序列标注的第二部分。仅作简单记录 Score计算 首先计算正确标签序列所对应的得分&#xff0c;这里需要注意&#xff0c;除了转移概率矩阵&#x1d40f;外&#xff0c;还需要维护两个大小…

担心插座预留的不够用,家里装修留多少开关插座

全屋插座布局,防漏防后悔      家里装修留多少开关插座?留多了费钱      留少了还不够用,给大家整理了全屋开关插座的布局      1,入户门留5个,门外给监控器1个      门旁边给卧室,走廊,客厅,中央空调各留1个      2,客厅留10个,电视留4-5个, 沙发两边各1…

html5——CSS基础选择器

目录 标签选择器 类选择器 id选择器 三种选择器优先级 标签指定式选择器 包含选择器 群组选择器 通配符选择器 Emmet语法&#xff08;扩展补充&#xff09; 标签选择器 HTML标签作为标签选择器的名称&#xff1a; <h1>…<h6>、<p>、<img/> 语…

如何做好漏洞扫描工作提高网络安全

在数字化浪潮席卷全球的今天&#xff0c;企业数字化转型已成为提升竞争力、实现可持续发展的关键路径。然而&#xff0c;这一转型过程并非坦途&#xff0c;其中网络安全问题如同暗礁般潜伏&#xff0c;稍有不慎便可能引发数据泄露、服务中断乃至品牌信誉受损等严重后果。因此&a…

edge 学习工具包 math solver

简介 推荐微软推出的学习工具中的两项工具&#xff1a;数学求解器和 pdf 阅读器。 打开 edge 学习工具包的方法 &#xff1a;右上角三点-更多工具-学习工具包。 math solver 除了基础的计算求解外&#xff0c;还用图标展示公式&#xff0c;清晰直观。 地址&#xff1a;求解…

CentOS7使用yum命令报错

目录结构 前言使用yum命令&#xff0c;报错信息问题排查解决方案参考文章 前言 安装CentOS 7 虚拟机&#xff0c;使用yum命令报错&#xff0c;调查整理如下&#xff1a; 使用yum命令&#xff0c;报错信息 [rootlocalhost ~]# sudo yum install net-tools 已加载插件&#xff…

OPenCV实现直方图均衡化----20240711

# 直方图均衡化import cv2 import numpy as np import matplotlib.pyplot as plt# 读取彩色图像 img = cv2.imread("./pictures/Lena.jpg")# 检查图像是否加载成功 if img is None:print("Could not open or find the i

每天五分钟深度学习:向量化技术在神经网络中的应用

本文重点 向量化技术,简而言之,就是利用矩阵运算(而非传统的for循环)来执行大规模的计算任务。这种技术依赖于单指令多数据(SIMD)架构,允许一个指令同时对多个数据元素执行相同的操作。例如,在向量化加法中,不再需要逐个元素进行加法操作,而是可以一次性对整个向量执…

【电子通识】无源元件与有源元件的定义和区别是什么?

当提到构成电路的电子器件时,许多人可能会想到晶体管、电容器、电感器和电阻器等器件。一般情况下,我们使用的电子器件分为两大类,即“有源元件”和“无源元件”。 有源元件是主动影响(如放大、整流、转换等)所供给电能的元件。 无源元件是对所供给的电能执行被动…

测试驱动开发的艺术:Xcode中实现TDD的全面指南

测试驱动开发的艺术&#xff1a;Xcode中实现TDD的全面指南 在软件开发过程中&#xff0c;测试驱动开发&#xff08;Test-Driven Development&#xff0c;TDD&#xff09;是一种以测试为先导的开发模式&#xff0c;它强调先编写测试用例&#xff0c;再编写功能代码&#xff0c;…

流程图编辑框架LogicFlow-vue-ts和js

LogicFlow官网https://site.logic-flow.cn/LogicFlow 是一款流程图编辑框架&#xff0c;提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端研发自定义开发各种逻辑编排场景&#xff0c;如流程图、ER图、BPMN流程等。在工作审批配…

【zabbix7】开启HTTP authentication实现单点登录

开启HTTP authentication实现单点登录 一、新建http验证用户 htpasswd -c /etc/nginx/.htpasswd another_username # 在提示中输入密码二、新建Nginx配置文件 把zabbix.conf拷贝一份&#xff0c;然后修改listen监听的端口。 cp zabbx.conf zabbix_http.conf 每个location中新…

【Dison夏令营 Day 16】如何使用 Python 中的 PyGame 制作俄罗斯方块游戏

俄罗斯方块(Tetris)是一款经典的益智游戏&#xff0c;游戏的目的是将落下的几何图形片&#xff08;称为 “俄罗斯方块”&#xff09;排列起来&#xff0c;填满水平线&#xff0c;不留空隙。当一条线被完全填满时&#xff0c;它就被清除了&#xff0c;玩家就能获得分数。随着四角…

操作系统——内存管理(面试准备)

虚拟内存 单片机没有操作系统&#xff0c;每次写完代码&#xff0c;都需要借助工具把程序烧录进去&#xff0c;这样程序才能跑起来。 另外&#xff0c;单片机的CPU是直接操作内存的物理地址。 在这种情况下&#xff0c;想在内存中同时运行两个程序是不可能的&#xff0c;如果第…

(CVPR-2024)SwiftBrush:具有变分分数蒸馏的单步文本到图像扩散模型

SwiftBrush&#xff1a;具有变分分数蒸馏的单步文本到图像扩散模型 Paper Title&#xff1a;SwiftBrush: One-Step Text-to-Image Diffusion Model with Variational Score Distillation Paper 是 VinAI Research 发表在 CVPR 24 的工作 Paper地址 Code:地址 Abstract 尽管文本…

Flutter-实现物理小球碰撞效果

效果 引言 在Flutter应用中实现物理动画效果&#xff0c;可以大大提升用户体验。本文将详细介绍如何在Flutter中创建一个模拟物理碰撞的动画小球界面&#xff0c;主要代码实现基于集成sensors_plus插件来获取设备的加速度传感器数据。 准备工作 在开始之前&#xff0c;请确保…

一文详解DDL同步及其应用场景

目录 一、什么是DDL&#xff1f; 二、什么是DDL同步&#xff1f; 三、DDL同步的痛点 1、缺少自动DDL同步机制 2、缺少DDL变更监测预警 四、解决方案 五、应用场景及案例 案例一 案例二 案例三 在现代数据管理中&#xff0c;数据库的结构变更频繁且不可避免&#xff0c;特别是在…

Kubelet 认证

当我们执行kubectl exec -it pod [podName] sh命令时&#xff0c;apiserver会向kubelet发起API请求。也就是说&#xff0c;kubelet会提供HTTP服务&#xff0c;而为了安全&#xff0c;kubelet必须提供HTTPS服务&#xff0c;且还要提供一定的认证与授权机制&#xff0c;防止任何知…

HTTP3.0

HTTP/3是HTTP协议的最新版本&#xff0c;它基于QUIC协议&#xff0c;具有以下特点&#xff1a; 无队头阻塞: QUIC 使用UDP协议来传输数据。一个连接上的多个stream之间没有依赖, 如果一个stream丢了一个UDP包&#xff0c;不会影响后面的stream&#xff0c;不存在 队头阻塞问题…

迪卡斯特拉算法与前式链向星结合的易错点

进行迪克特斯拉算法的时候我们需要标记已经访问过的节点&#xff0c;而这个节点是否访问过的判断也是需要注意的 int dikj() {priority_queue<pair<int, int>> q;int ma 0;//vis[start] 1; // 记录一下 不用写for (int i 0; i < n; i) vis[i] 0,di[i] 0x…