文章目录

  • 1:什么是布隆过滤器
  • 1.1:使用场景
  • 1.2:布隆过滤器
  • 2:布隆过滤器的安装 (不要下载 master 版本)
  • 2.1: 找到源码压缩包地址
  • 2.2:linux 系统中进行下载
  • 2.3:编译
  • 2.4:启动 redis 挂载 redisbloom.so
  • 2.5:启动 redis 客户端
  • 3:布隆过滤器的使用
  • 4:布隆过滤器被穿透


1:什么是布隆过滤器

1.1:使用场景

redis 中有这么个场景:缓存中没有,直接去数据库访问,其实数据库中也没有,数据库白白的浪费性能
以上就是 redis 的缓存穿透问题,布隆过滤器就是缓解这个问题而来的,注意是缓解,可以达到 99%,却不能完全解决。

解决方案:
1:将数据库已有的数据通过几个哈希函数得到几个 hash 值,在 bitmap 中进行二进制替换。
2:当一个请求到达,同样经过几个哈希函数得到几个hash值,然后检查这些哈希值中对应的比特值。如果有任意一个比特值为 0,则表明该元素一定不存在,如果所有比特值都是 1,则表明该元素可能存在。为什么不是一定存在呢?因为一个比特值为 1 有可能会受到其他元素的影响。

1.2:布隆过滤器

布隆过滤器是用于检测一个元素是否一定不存在或者有可能存在。

布隆过滤器是一个由 一个长度为 M 比特的位数组(bit array)与 K 个哈希函数(hash function) 组成的数据结构。
布隆过滤器主要用于用于检索一个元素是否在一个集合中。
位数组中的元素初始值都是 0 ,所有哈希函数可以把输入的数据均匀低散列。

优点:
不需要存储数据,只用比特表示,因此在空间占用率上有巨大的优势
检索效率搞,插入和查询的时间复杂度都为 O(K)(K 表示哈希函数的个数)
哈希函数之间相互独立,可以在硬件指令层次并行计算,因此效率较高。
缺点:
存在不确定的因素,无法判断一个元素是否一定存在,所以不适合要求 100% 准确率的场景
只能插入和查询元素,不能删除元素。

2:布隆过滤器的安装 (不要下载 master 版本)

redis 的安装已经写过,这篇博客基于已经安装好 redis 的 linux 系统,需要安装 redis ,可查看

2.1: 找到源码压缩包地址


Java实现redis布隆过滤器 redis使用布隆过滤器_redis


找到发行版

Java实现redis布隆过滤器 redis使用布隆过滤器_redis_02


复制压缩包的链接地址 :

Java实现redis布隆过滤器 redis使用布隆过滤器_缓存_03

2.2:linux 系统中进行下载

将 RedisBloom 源码和 redis 放在一起(个人习惯),因此来到这个页面进行 RedisBloom 源码下载,也可以下载好通过 xftp 上传到此文件夹下

cd /jqk/redis
ls
# 需要先安装  wegt ,执行命令 yum -y install wget  
wegt https://github.com/RedisBloom/RedisBloom/archive/refs/heads/master.zip

Java实现redis布隆过滤器 redis使用布隆过滤器_缓存_04


解压

unzip  V.2.2.12.zip

Java实现redis布隆过滤器 redis使用布隆过滤器_数据库_05

2.3:编译

来到解压后的 redisbloom 文件夹下,进行编译

cd RedisBloom-2.2.12/
 make

Java实现redis布隆过滤器 redis使用布隆过滤器_布隆过滤器_06


查看编译后的文件夹,发现 多了一个 redisbloom.so 文件,移动到 /usr/local/redis/ 下

ls
mv redisbloom.so  /usr/local/red
cd /usr/local/redis
ls

Java实现redis布隆过滤器 redis使用布隆过滤器_数据库_07

2.4:启动 redis 挂载 redisbloom.so

方法一:通过命令方式挂载

redis-server  --loadmodule /usr/local/redis/redisbloom.so

Java实现redis布隆过滤器 redis使用布隆过滤器_缓存_08


方法二:再配置文件里面添加

# 查看 6379 的配置文件
vim /etc/redis/6379.conf

Java实现redis布隆过滤器 redis使用布隆过滤器_布隆过滤器_09

2.5:启动 redis 客户端

redis-cli -p 端口 -a 密码

3:布隆过滤器的使用

一个比特值为 0,则表明该元素一定不存在,如果所有比特值都是 1,则表明该元素可能存在

Java实现redis布隆过滤器 redis使用布隆过滤器_Java实现redis布隆过滤器_10

4:布隆过滤器被穿透

集成了 布隆过滤器,其实还是存在穿透的风险,有两种场景
1: redis 集成 布隆过滤器:查询穿透了,数据库中卻不存在, redis 中需要增加这个key,value 标记不存在,下次再查询,就不走布隆了,直接返回不存在
2:数据库单独集成 布隆过滤器:如果数据库中增加了元素,需要增加元素对布隆的增加

注意:上面虽然方案更加全面,但是同时也带来了新的问题,也就是 双写的问题,这个不是我们本文的重点,随便提一下