Redis(十) 布隆过滤器

2023-05-16

速记

为什么使用布隆过滤器?
1.为了省内存,提高速率
2.因为1所以布隆过滤器不需要百分百正确
3.说存在不一定存在,说不存在一定不存在
4.在解决缓存穿透的问题时,拦截了大部分的请求,只有小部分携带了大量信息的恶意请求访问到了数据库
5.不准确的原因是可能会和别的key发生冲突,所以位数组越大精确度越高,但是占用内存越多。所以在设置布隆过滤器的时候,这个容错率是多少是百分之一还是百分之十,是否牺牲内存来提高容错率这个我们要权衡一下。
6.专门用来解决缓存穿透的问题

一. Bloom Filter

1.1 布隆过滤器介绍

Bloom Filter 专门用来解决我们上面所说的去重问题的,使用 Bloom Filter 不会像使用缓存那么浪费空间。当然,他也存在一个小小问题,就是不太精确。即说存在不一定存在,说不存在一定不存在
Bloom Filter 相当于是一个不太精确的 set 集合,我们可以利用它里边的 contains 方法去判断某一个对象是否存在,但是需要注意,这个判断不是特别精确。一般来说,通过 contains 判断某个值不存在,那就一定不存在,但是判断某个值存在的话,则他可能不存在。

1.2例子

实际案例1

以今日头条为例,假设我们将用户的浏览记录用 B 表示,A 表示用户没有浏览的新闻,现在要给用户推送消息,先去 B 里边判断这条消息是否已经推送过,如果判断结果说没推送过(B 里边没有这条记录),那就一定没有推送过。如果判断结果说有推送过(B 里边也有可能没有这条消息),这个时候该条消息就不会推送给用户,导致用户错过该条消息,当然这是概率极低的。

实际案例二

前面所说的新闻推送过滤算是一个应用场景。

解决 Redis 穿透或者又叫缓存击穿问题。

假设我有 1亿 条用户数据,现在查询用户要去数据库中查,效率低而且数据库压力大,所以我们会把请求首先在 Redis 中处理(活跃用户存在 Redis 中),Redis 中没有的用户,再去数据库中查询。

现在可能会存在一种恶意请求,这个请求携带上了很多不存在的用户,这个时候 Redis 无法拦截下来请求,所以请求会直接跑到数据库里去。这个时候,这些恶意请求会击穿我们的缓存,甚至数据库,进而引起“雪崩效应”。

为了解决这个问题,我们就可以使用布隆过滤器。将 1亿条用户数据存在 Redis 中不现实,但是可以存在布隆过滤器中,请求来了,首先去判断数据是否存在,如果存在,再去数据库中查询,否则就不去数据库中查询。

1.3 布隆过滤器原理

每一个布隆过滤器,在 Redis 中都对应了一个大型的位数组叫做位数组以及几个不同的 hash 函数。

所谓的 add 操作是这样的:

首先根据几个不同的 hash 函数给元素进行 hash 运算一个整数索引值,拿到这个索引值之后,对位数组的长度进行取模运算,得到一个位置,每一个 hash 函数都会得到一个位置,将位数组中对应的位置设置位 1 ,这样就完成了添加操作。

比如说你想存一个值javaboy
这里的位数组用三个hash给javaboy求一个hash出来,分别是5,6,8然后用5,6,8分别和数组的长度取模,结果还是5,6,8
相同,itboyhub 取模结果是0,5,6
在这里插入图片描述
当判断元素是否存在时,依然先对元素进行 hash 运算,将运算的结果和位数组取模,然后去对应的位置查看是否有相应的数据,如果有,表示元素可能存在(因为这个有数据的地方也可能是其他元素存进来的),如果没有表示元素一定不存在。

Bloom Filter 中,误判的概率和位数组的大小有很大关系,位数组越大,误判概率越小,当然占用的存储空间越大位数组越小,误判概率越大,当然占用的存储空间就小

实际应用中自己去设置这个概率,布隆过滤器会自动的分配数组的大小

1.4 布隆过滤器的安装

布隆过滤器是GitHub上的开源项目

github.com/RedisBloom/RedisBloom/releases我们先访问这个地址去找到适合自己版本的布隆过滤器

这里黄黄下载一个2.2.18的稳定版本,你要下载什么版本要对照着你Redis的版本哦
在这里插入图片描述
在这里插入图片描述

然后去把你的redis集群全部关掉
在这里插入图片描述

进入你的redis的目录下去下载布隆过滤器

wget https://github.com/RedisBloom/RedisBloom/archive/refs/tags/v2.2.18.tar.gz
在这里插入图片描述

(如果下载不下来的兄弟,用刚才的github的路径下载安装包到windows,再丢到linux里面去解压吧,再用tar -zxvf 文件包名 去解压)

然后进入布隆过滤器的包中:
因为我们之前装过了gcc,所以这里只要执行make指令就行,没有装gcc的兄弟翻一下以前的博客装一下gcc
在这里插入图片描述

安装完成之后发现比安装之前多了一个redisbloom.so文件
在这里插入图片描述

记住到RedisBloom包之中的路径:
黄黄这里是:/usr/local/redis-6.2.6/RedisBloom-2.2.18
在这里插入图片描述

退回到redis包中
在这里插入图片描述

进入redis.conf配置类,启动布隆过滤器的开机自动启动
在这里插入图片描述

/moules 搜索到外部modules模块:如下
在这里插入图片描述
添加:/usr/local/redis/RedisBloom是我们上面保存的地址加上/redisbloom.so即我们找到的这个布隆过滤器里的配置文件,记得加上loadmoule前缀,即
loadmodule /usr/local/redis/RedisBloom/redisbloom.so
在这里插入图片描述

,启动我们的redis就行了,因为配置了布隆过滤器,所有开启redis布隆就应该生效了,当然没生效肯定是配置的什么地方出现了问题,那么就要我们自己去排错了。
在这里插入图片描述

判断布隆过滤器是否启动

再进入命令行就可以去使用命令了
主要是两类命令,添加和判断是否存在。

  • bf.add\bf.madd 添加和批量添加
  • bf.exists\bf.mexists 判断是否存在和批量判断

1.5 布隆过滤器的基本用法-小例子

添加依赖

<dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.redislabs</groupId>
            <artifactId>jrebloom</artifactId>
            <version>1.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.17.5</version>
        </dependency>
        <dependency>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
            <version>6.2.0.RELEASE</version>
        </dependency>
public class BloomFilterDemo {
    public static void main(String[] args) {
        //通用的连接池对象,这里主要是设置最大连接数、最小空闲数等参数
        GenericObjectPoolConfig<Jedis> poolConfig = new GenericObjectPoolConfig<>();
        //最大连接数
        poolConfig.setMaxTotal(100);
        //最小空闲数
        poolConfig.setMinIdle(10);
        //连接最大空闲数
        poolConfig.setMaxIdle(20);
        JedisPool jedisPool = new JedisPool(poolConfig, "1.12.235.192", 6379,null,"123");
        Client client = new Client(jedisPool);
        for (int i = 0; i < 100; i++) {
            client.add("myfilter", "zhangsan:" + i);
        }
        System.out.println("client.exists(\"myfilter\", \"zhangsan:99\") = " + client.exists("myfilter", "zhangsan:99"));
        System.out.println("client.exists(\"myfilter\",\"zhangsan:99999999\") = " + client.exists("myfilter", "zhangsan:99999999"));
    }
}

1.5.1 调节布隆的过滤错误率

默认情况下,我们使用的布隆过滤器它的错误率是 0.01 ,默认的元素大小是 100。但是这两个参数也是可以配置的。

我们可以调用 bf.reserve 方法进行配置。

BF.RESERVE k1 0.0001 1000000
第一个参数是 key,第二个参数是错误率,错误率越低(意味着位数组越长),占用的空间越大,第三个参数预计存储的数量,当实际数量超出预计数量时,错误率会上升。

1.6布隆的典型场景

前面所说的新闻推送过滤算是一个应用场景。

解决 Redis 穿透或者又叫缓存击穿问题。

假设我有 1亿 条用户数据,现在查询用户要去数据库中查,效率低而且数据库压力大,所以我们会把请求首先在 Redis 中处理(活跃用户存在 Redis 中),Redis 中没有的用户,再去数据库中查询。

现在可能会存在一种恶意请求,这个请求携带上了很多不存在的用户,这个时候 Redis 无法拦截下来请求,所以请求会直接跑到数据库里去。这个时候,这些恶意请求会击穿我们的缓存,甚至数据库,进而引起“雪崩效应”。

为了解决这个问题,我们就可以使用布隆过滤器。将 1亿条用户数据存在 Redis 中不现实,但是可以存在布隆过滤器中,请求来了,首先去判断数据是否存在,如果存在,再去数据库中查询,否则就不去数据库中查询

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis(十) 布隆过滤器 的相关文章

  • centos8系module软件包管理仓库部署

    简述 CentOS8 引入新的module软件包管理机制 下面将介绍如何部署搭建本地module源 部署流程 xff1a 思路 xff1a 先制作nginx 1 14的module yaml xff08 需要微调 xff09 xff0c 然
  • grub rescue救援模式的处理

    grub rescue救援模式的处理 来源 xff1a https www cnblogs com itcomputer articles 4182344 html 我的linux在调整分区后 xff0c 出现了grub rescue gt
  • gitlab自定义头像设置

    这里写自定义目录标题 选一个自己喜欢的头像放在自建nginx服务中 可放在gitlab的nginx中 xff1a 设置gitlab修改配置 etc gitlab gitlab rb 重新加载gitlab配置最终效果 选一个自己喜欢的头像放在
  • 【无标题】

    https www cnblogs com liujuncm5 p 6713784 html 一 依赖安装 yum install y gcc c 43 43 pcre pcre devel zlib zlib devel openssl
  • shell:批量下载epel源rpms

    span class token keyword for span span class token for or select variable i span span class token keyword in span span c
  • linux静动态依赖

    安装glibc static usr bin ld cannot find lpthread usr bin ld cannot find lc
  • 修改ftp根目录

    修改 etc vsftpd vsftpd conf xff0c 加入如下三行 xff1a local root 61 chroot local user 61 YES anon root 61 local root表示使用本地用户登录到ft
  • 基于深度学习的医学图像配准综述

    原文转自 xff1a https blog csdn net weixin 41699811 article details 84314070 版权声明 xff1a 本文为CSDN博主 Timmymm 的原创文章 xff0c 遵循 CC 4
  • C语言实现生产者消费者模型(线程、信号量、互斥锁)

    三个概念 xff1a 生产者消费者模型 线程 信号量 1 生产者消费者模型 利用生活中的例子 xff0c 生产者生产商品 xff0c 商品放在超市 xff0c 消费者去超市购买 使用 商品 xff0c 也就是生产者消费者模型 生产者生成一定
  • Linux Deepin [解决] - 您也许需要运行“apt --fix-broken install”来修正上面的错误。

    问题来源 Os Linux Deepin 20 社区 在星火商店下载了网易云音乐的包 xff0c 用深度安装器安装 xff0c 能用能调节窗口大小 xff0c 但是字体大小不能调剂 emmm高分屏用户哭了后悔自己买那么高的玩意 于是右键卸载
  • C++判断素数(求素数)

    一个大于1的自然数 xff0c 且除了1和它本身外 xff0c 不能被其他自然数整除的数叫素数 换句话说就是 xff0c 除了1和该数本身以外不再有其他的因数的数被称为素数 判断m是否是素数的算法是 xff1a m在区间 1 xff0c s
  • Arch Linux wine 微信、heidissql、chrome - AUR heplers - yay

    Intro span class token function uname span a Linux arch 5 10 16 arch1 1 span class token comment 1 SMP PREEMPT Sat 13 Fe
  • C语言-基础例题55道

    1 简单程序设计 编程写程序 xff0c 在屏幕上输出信息 xff1a Happy New Year 输出图形 include lt stdio h gt void main printf 34 Happy New Year n 34 2
  • Python 端口扫描器

    目录 前言一 TCP全连接二 程序编写1 获得主机名和端口2 解析主机名和端口3 抓取应用的Banner4 线程扫描5 信号量机制 总结 前言 任何一个靠谱的网络攻击都是起步于侦查的 在这里 xff0c 我们将使用Python来编写一个扫描
  • linux 实现开机自动登陆

    1 Linux实现开机自动登陆 可以指定登陆的账户 在登陆Linux系统的时候 xff0c 在登陆界面往往需要输入密码后进行登陆 xff0c 如果想实现Linux锡系统开机后自动登陆某个账户 xff0c 可以进行如下的设置 xff1a 可以
  • python中@statimethod和@clasmetod的简单理解

    1 64 statimethod xff1a 加上这一句话 xff0c 不需要实例化即可调用类方法 举例如下 xff1a 但我发现 xff0c 只要定义方法时加了self 再用静态方法会一直报错 实例化和非实例化都会报错 2 64 clas
  • 长文慎入,如何快速开发区块链游戏

    长文慎入 xff0c 如何快速开发区块链游戏 译者注 xff1a 原文 xff1a 初始发行Enjin整合初始整合客户端SDK GUI客户端SDK APIEnjin的API是GraphQL Enjin推荐使用服务器排列你的物品并分批发送存储
  • Nginx配置文件(nginx.conf)配置详解

    Nginx配置文件nginx conf中文详解 定义Nginx运行的用户和用户组user www www nginx进程数 xff0c 建议设置为等于CPU总核心数 worker processes 8 全局错误日志定义类型 xff0c d
  • 【有机】提纲整理1——化学基础

    周环反应 元素 xff08 磷硫硅 xff09 金属有机 生物有机 天然产物 含氮化合物 含氧化合物 醇 酚 醚 醛 酮 醌 羧酸及其衍生物 卤代烷 碳氢化合物 烷烃 烯烃 炔烃 苯 历史 结构 命名 波谱 立体化学 1 原子结构与化学键的
  • 求二叉树的高度

    二叉树高度是二叉树的重要知识点 xff0c 在日常练习中我们会经常碰见这种类型的题目 求解二叉树的高度可以用递归方式 递归求解二叉树高度 int GetHeight BinTree BT int h1 int h2 if BT return

随机推荐

  • Linux开启ssh远程登录

    Linux配置ssh 开启远程登录 你好 xff01 这里介绍了Linux系统Centos Ubuntu环境下开启ssh的方法 一 CentOS开启SSH服务 安装openssh server xff1b yum list installe
  • Python 中if...else语法和作用、执行流程

    一 if else语法 作用 xff1a 条件成立执行if下方的代码 xff0c 条件不成立执行else下方的代码 案例说明 xff1a 比如拿成年网吧上网的例子 xff0c 如果成年 xff0c 就允许上网 xff0c 如果不成年 xff
  • Ubuntu20.04安装ssh并开启远程访问登录

    1 安装openssh server 打开终端安装openssh server软件包 xff1a span class token function sudo span span class token function apt span
  • pixhawk在启动jmavsim时,启动不了

    lcg 64 ubuntu src Firmware sudo make px4 sitl jmavsim 1 1 cd home lcg src Firmware build cg src Firmware build px4 sitl
  • 数据转换成tfrecord类型并完成读取

    前提 xff1a tensorflow 1 13 1 numpy 1 16 2 python 3 6 5 本例转换 泰坦尼克号数据集 链接 密码 xff1a n8wz 数据预览 xff1a 字段说明 xff1a PassengerId xf
  • Notepad++如何配置NppFTP连接FTP服务器远程编辑

    Notepad 43 43 是很强大的文本编辑工具 xff0c 通过NppFTP插件可以远程连接FTP服务器 xff0c 实现文件的在线编辑 不需要FTP下载文件后再进行编辑 xff0c 配置好与FTP服务器的连接后 xff0c 使用起来会
  • Ubuntu install Chrome

    wget https dl google com linux direct google chrome stable current amd64 deb sudo dpkg i google chrome stable current am
  • 简易输出六十天干地支

    每行十个输出六十天干地支 public static void main String args int i 61 0 count 61 0 step 61 0 String top 61 34 甲 34 34 乙 34 34 丙 34 3
  • 小记:Xshell 简单STP上传下载文件

    小记 xff1a Xshell 简单STP上传下载文件 目录 xff1a 1 Xshell连接远程系统 2 STP连接 3 put get上传下载文件 工具说明 xff1a 本地Windows 10系统 远程Linux系统 xff1a Ce
  • info函数与describe函数

    info 函数与describe 函数 一 xff0c info 函数 功能 xff1a 给出样本数据的相关信息概览 xff1a 行数 xff0c 列数 xff0c 列索引 xff0c 列非空值个数 xff0c 列类型 xff0c 内存占用
  • 快速排序(java代码)

    文章目录 一 快排核心思想二 实例三 代码实现 xff08 java xff09 一 快排核心思想 快排核心思想就是 xff1a 首先在待排序数组中随便选择一个数作为节点 xff08 pivot xff09 xff0c 然后从最后面 xff
  • C# List集合查找删除指定数据

    C List集合查找删除指定数据 文章目录1 实体类2 操作第一个负荷条件数据3 操作所有符合条件数据4 优质源码 文章目录 1 实体类 public class FaultLevelModel public string LBWJ get
  • java.lang.IllegalArgumentException: Unable to instantiate factory class

    前提 xff1a 这两天在搭springboot后台框架的时候 xff08 用的JDK1 8和eclipse xff09 xff0c 折腾了半天 xff0c 在搞泛型的时候会有一些报错 xff0c 原来IDEA上的代码 xff0c 在ecl
  • 发声单元的原理/扬声器的工作原理

    目前市面上常见的耳塞以及耳机的发声单元主要有三种 xff0c 分别是动圈单元 动铁单元和静电单元 静电单元由于工艺比较复杂 成本高 xff0c 单元本身比较脆弱 xff0c 所以市面上并不多见 所以下面着重介绍动圈单元和动铁单元的发声原理
  • 猿创征文|Hexo+Github搭建完全免费个人博客详细教程

    前言 完全免费的搭建个人博客 xff0c 没有任何收费 xff0c 零基础也能上手 xff0c 不需要编程基础 xff0c 跟着操作来即可 首先 xff1a 要了解一下我们搭建博客要用到的框架 xff1a Hexo是高效的静态站点生成框架
  • 3维向量的点乘叉乘运算

    目录 三维向量的点乘三维向量的叉乘点到直线的距离点到平面的距离 三维向量的点乘 点乘得到的是对应元素乘积的和 xff0c 是一个标量 xff0c 没有方向 V1 x1 y1 z1 V2 x2 y2 z2 61 x1x2 43 y1y2 43
  • Windows Server 2016修改Administrator的密码

    1 xff09 在仪表盘上 xff0c 点击 工具 菜单 xff0c 选择 计算机管理 子菜单 2 xff09 本地用户和组 gt 用户 选中Administrator xff0c 点击右键 xff0c 弹出的菜单中选择 设置密码 的子菜单
  • Ubuntu安装Tomcat 执行[./startup.sh]命令显示“ Permission denied “问题解决

    报错贴图 xff1a 根据错误提示 xff0c 为权限问题 然后我们检查权限情况 xff1a 方框中为管理员权限 xff0c 显示为rw r代表read xff08 读 xff09 xff0c w代表write xff08 写 xff09
  • 2021年7月1日:AndroidStudio集成opencv指南。

    版本声明 xff1a 1 AndroidStudio 4 2 1 2 opencv版本4 5 2 3 androidStudio创建项目选择项目类型Native C 43 43 4 下载opencv android版本解压后 xff0c 找
  • Redis(十) 布隆过滤器

    速记 为什么使用布隆过滤器 xff1f 1 为了省内存 xff0c 提高速率 2 因为1所以布隆过滤器不需要百分百正确 3 说存在不一定存在 xff0c 说不存在一定不存在 4 在解决缓存穿透的问题时 xff0c 拦截了大部分的请求 xff