Redis布隆过滤亿级大数据

场景描述

小程序用户的openid作为最主要的业务查询字段,在做了缓存设计之后仍有非常高频的查询,通过埋点简单统计约在每日1000w次。
其中:由于有新增用户原因,导致请求的openid根本不存在MySQL数据库中,这部分统计约占30%左右,也就是约300w次查询是浪费的。

假设openid的总量可能达到10亿级别

解决思路:基于redis使用布隆过滤器 

方案介绍

1. 布隆过滤器

布隆过滤器(Bloom Filter)
是一种数据结构,其主要功能是判断某个元素是否出现在集合中。
它通过使用多个哈希函数将元素映射到一个位数组中,并将对应位标记为1,来实现对元素的判重。
如果一个元素在位数组中对应的位置上有一位为0,那么该元素一定不存在于集合中,
如果所有对应位都为1,那么该元素可能存在于集合中。

具体来说:
当要加入一个元素时,使用多个不同的哈希函数对该元素进行哈希,得到多个哈希值,然后将这些哈希值对应的位数组上的位置置为1。
当查找一个元素时,同样使用多个哈希函数进行哈希,然后查看对应位置上的位,
如果存在任意一位为0,那么该元素不存在于集合中;
如果所有位都为1,那么该元素可能存在于集合中,需要进一步确认。

但是,布隆过滤器存在一定的误判率。

对于一个元素,如果多个哈希函数将其映射到的位都已被标记为1,则它可能被误判为存在于集合中,即有一定的假阳性率 。

误判率取决于哈希函数的数量和位向量的长度。

2. 10亿数据如何做布隆过滤?

· redis的bitmap

Bitmap:是一种Bit数组数据结构,它的主要作用是储存0和1两个状态。

在Redis中,Bitmap通过字符串来实现,一个字符串可以存储超过2^32个元素,所以一个bloom能存储的最大上限就是2^32个,约42.9亿。占用的内存是512M

虽然单个bitmap最大可达到42亿,但是算上误差率其实是不够的,而且在redis中我们也应该尽量避免这种大key的使用

· 分片

  1. 范围划分:将 32-bit 的范围 ([0, n)) 划分为 2^10 个桶,每一个桶有一个 Container 来存放一个数值的低26位;
  2. 存储:在存储和查询数值的时候,将一个数值 k 划分为高 10 位(k % 2^10)和低 26 位(k mod 2^26),取高 10 位找到对应的桶,然后在低 26 位存放在相应的 Container 中;
  3. 查询判断:当查询一个数值 k 是否存在时,我们只需要判断 k mod 2^26 是否存在于对应的 Container 中即可。

· 实现取高位和低位代码 

取高位作桶,就是通过位运算向右移10位
将一个数的二进制位向左或向右移动特定的位数。向左移动相当于在该数的二进制表示中加上多个0,向右移动相当于去掉多余的二进制位

$container = $hash >> 10; 

取低位作数据字段,就是通过&位运算取26位
它对两个数的每一个二进制位进行比较,只有当两个数的对应二进制位都为1时,结果才会将该位置设置为1,否则设置为0
0x3FFFFFF是26位全1的二进制数的16进制表示方式
可以简单理解为就是截取了一个数的低26位

$index     = $hash & 0x3FFFFFF; 

· go-zero的bloom介绍(core/bloom/bloom.go)

// New create a Filter, store is the backed redis, key is the key for the bloom filter,
// bits is how many bits will be used, maps is how many hashes for each addition.
// best practices:
// elements - means how many actual elements
// when maps = 14, formula: 0.7*(bits/maps), bits = 20*elements, the error rate is 0.000067 < 1e-4
// for detailed error rate table, see http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html
func New(store *redis.Redis, key string, bits uint) *Filter {return &Filter{bits:   bits,bitSet: newRedisBitSet(store, key, bits),}
}

go-zero内置的bloom默认采用的hash次数是14,元素预估需要使用的bitmap位数是20倍多元素数量,错误率在0.000067左右

· Hash函数规划

已知元素总量为10亿,分片数为2^10=1024,那么每个分片元素数量为976562,需要的bitmap长度是 20*976562 = 19531240,也就是小于2^25=33554432(redis官网上介绍,bitmap长度达到2^26-1大约需要8M内存),那么总内存预估使用8G左右,分散在集群的各个节点上

所以保留一定的弹性范围,在使用go-zero自带的bloom时,key根据2^10进行分片,单个bloom的bits=30000000

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

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

相关文章

使用vite创建vue3项目及项目的配置 | 环境准备 ESLint配置 prettier配置 husky配置 项目继承

文章目录 使用vite创建vue3项目及项目的配置1.环境准备2.项目配置ESLint校验代码工具配置 - js代码检测工具1.安装ESLint到开发环境 devDependencies2.生成配置文件:.eslint.cjs**3.安装vue3环境代码校验插件**4. 修改.eslintrc.cjs配置文件5.生成ESLint忽略文件6.在package.js…

[BJDCTF2020]Mark loves cat foreach导致变量覆盖

这里我们着重了解一下变量覆盖 首先我们要知道函数是什么 foreach foreach (iterable_expression as $value)statement foreach (iterable_expression as $key > $value)statement第一种格式遍历给定的 iterable_expression 迭代器。每次循环中&#xff0c;当前单元的值被…

Learn Prompt-ChatGPT 精选案例:广告文案

ChatGPT 可以帮助我们生成广告文案和宣传图片&#xff0c;这对营销品牌建设很有帮助。通常&#xff0c;一个产品会有一个主要的广告词&#xff0c;传达设计理念或宣传产品的好处。我们可以尝试直接生成文案&#xff0c;看看 ChatGPT 有没有好的创意。假设我们的产品是一款登山鞋…

计算机专业毕业设计项目推荐06-工作室管理系统(Java+Vue+Mysql)

工作室管理系统&#xff08;JavaSpringVueMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现****最后想说的****联系方式** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较…

Word 文档转换 PDF、图片

工作有需要 Word 文档转换 PDF、图片 的场景&#xff0c;我们来看看 Java 开发中怎么解决这个问题的。 Word 转 PDF Word 转 PDF 分为商用 Aspose 方案和开源 Apache POIiText 方案。 Aspose 方案 这种方式在目前来看应该是最好的&#xff0c;无论是转换的速度还是成功的概…

100道基于Android毕业设计的选题题目,持续更新

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 大家好&#xff0c;我是程序员徐师兄、今天给大家谈谈基于android的app开发毕设题目&#xff0c;以及基于an…

深入理解Java单例模式和优化多线程任务处理

目录 饿汉模式懒汉模式单线程版多线程版双重检查锁定 阻塞队列 单例模式能保证某个类在程序中只存在唯一一份实例, 而不会创建出多个实例&#xff0c;并提供一个全局访问点。 饿汉模式 类加载的同时&#xff0c;创建实例。 class Singleton {private static final Singlet…

运维自动化:提高效率的秘诀

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

GEE:快速实现NDVI时间序列NDVI线性趋势和变化敏感性计算(斜率、截距)

作者:CSDN @ _养乐多_ 本博客将向您介绍如何使用Google Earth Engine(GEE)平台来处理Landsat 5、7和8的卫星图像数据,计算NDVI的斜率和截距,以及如何导出这些结果供进一步分析使用。 文章目录 一、代码详解1.1 核心代码详解1.2 核心代码详解1.3 代码框架介绍二、完整代码…

LeetCode: 高频动态规划题目总结 - Python

LeetCode:高频动态规划题目总结 问题描述&#xff1a; LeetCode: 5. 最长回文子串LeetCode: 10. 正则表达式匹配 点 星 . * 那个LeetCode: 22. 括号生成 实际是栈操作LeetCode: 32. 最长有效括号 实际是栈操作LeetCode: 42. 接雨水LeetCode: 44. 通配符匹配 &#xff0c;&…

day06_Java中的流程控制语句

流程控制 简单来讲所谓流程就是完成一件事情的多个步骤组合起来就叫做一个流程。在一个程序执行的过程中&#xff0c;各条语句的执行顺序对程序的结果是有直接影响的。我们必须清楚每条语句的执行流程。而且&#xff0c;很多时候要通过控制语句的执行顺序来实现我们想要的功能…

智慧公厕助力数字强市建设,打造善感知新型信息化公共厕所

随着城市建设的不断发展&#xff0c;智慧公厕作为一个重要的基础设施&#xff0c;正逐渐受到人们的重视。智慧公厕不仅为人们提供舒适的使用环境&#xff0c;更是通过数字化技术的应用&#xff0c;为城市发展注入新的动力。本文将以智慧公厕源头厂家广州中期科技有限公司&#…

@Validated 和 @Valid 的区别,你真的懂吗?SpringBoot 参数校验必知必会!

概述 Valid是使用Hibernate validation的时候使用Validated是只用Spring Validator校验机制使用 说明&#xff1a;java的JSR303声明了Valid这类接口&#xff0c;而Hibernate-validator对其进行了实现 Validation对Valid进行了二次封装&#xff0c;在使用上并没有区别&#xff…

python多线程、进程

1、 并行和并发 &#xff08;1&#xff09;并发&#xff1a;一定周期内&#xff0c;多个任务来回切换执行&#xff0c;宏观上形成“该周期内有多个任务在同时进行”&#xff1b;但同一时间点&#xff0c;只有一个任务在执行。 举例&#xff1a; 你想在2小时内同时完成做饭、扫…

Iterator设计模式

目录 1、示例 1.1 Aggregate接口 1.2 Iterator接口 1.3 Book类 1.4 BookShelf类 1.6 BookShelfIterator 类 1.7 Main类 2、解释Iterator模式中的角色 2.1 Iterator模式的存在意义 2.2 抽象类和接口 2.3 Aggregate 和 Iterator的对应 2.4 容易弄错"下一个"…

QT:使用多窗口做一个登录注册小项目(登录窗口、登录结果窗口、注册窗口)

widget.h(登录窗口) #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QCheckBox> #include <QLabel> #include <QLineEdit> #include <QPushButton> #include <Qmap> //模板类class Widget : public QWidget …

rust切片

切片类型写为[T]。 切片是序列的一个片段。 它是动态大小类型&#xff0c;所以要使用切片类型&#xff0c;就必须使用它的指针类型。引用是最常用的指针类型。 [T; n]能隐式转换成[T]。 一、定义切片 &#xff08;一&#xff09;不可变切片 &[T]&#xff0c;共享切片&…

有效的括号(栈的高频面试题)

一、题目描述 题目连接&#xff1a;有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺…

005-第一代光电小工具(一)

第一代光电小工具(一) 文章目录 第一代光电小工具(一)项目介绍大致原理描述核心控件QCustomPlot关于QCustomPlot 播放音频软件截图 关键字&#xff1a; Qt、 Qml、 QCustomPlot、 曲线、 SQLite 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&…

2024届数字IC设计秋招面经-鼎信

背景 985硕士&#xff0c;计算机科班&#xff0c;实验室做cpu设计和fpga算法加速&#xff0c;我做处理器安全方向&#xff0c;有项目。 投递 8.25 没有笔试&#xff0c;两轮面试&#xff0c;直接通知下周一面试&#xff0c;草草的准备了下。 一面 技术面 9.4 不到半小时 …