【前面的话】前面已经安装了WSL2 ,最近准备研究一下Redis的布隆过滤器,现在就先搭建一下环境。
壹、准备环境
- WSL:WSL2
- Docker: Docker for Windows
Use the WSL 2 based engine
贰、安装过程
2.1 前情资讯
Redis v4.0
之后有了 Module(模块/插件)
功能,Redis Modules
让 Redis
可以使用外部模块扩展其功能 。布隆过滤器就是其中的Module
。详情可以查看Redis
官方对 Redis Modules
的介绍 :https://redis.io/modules
另外,官网推荐了一个RedisBloom
作为Redis
布隆过滤器的Module
,地址:https://github.com/RedisBloom/RedisBloom. 其他还有:
- redis-lua-scaling-bloom-filter (lua 脚本实现):https://github.com/erikdubbelboer/redis-lua-scaling-bloom-filter
- pyreBloom(Python中的快速Redis 布隆过滤器) :https://github.com/seomoz/pyreBloom
- ……
RedisBloom
提供了多种语言的客户端支持,包括:Python
、Java
、JavaScript
和 PHP
。
2.2 Docker安装
如果我们需要体验Redis
中的布隆过滤器非常简单,通过 Docker 就可以了!这里我们使用这个仓库下的镜像:https://hub.docker.com/r/redislabs/rebloom/
下面是具体命令:
1 | cc@Chirius:/mnt/c/Users/Chirius$ docker run -p 9379:6379 --name redis-redisbloom redislabs/rebloom:latest |
根据提示修改内存参数等,注意使用root用户:
1 | cc@Chirius:/mnt/c/Users/Chirius$ cd ~ |
然后再重启容器,就可以启动成功了,然后进行体验
叁、布隆过滤器体验
3.1 常用命令
注意: key:布隆过滤器的名称,item : 添加的元素。
BF.ADD
:将元素添加到布隆过滤器中,如果该过滤器尚不存在,则创建该过滤器。格式:BF.ADD {key} {item}
。BF.MADD
: 将一个或多个元素添加到“布隆过滤器”中,并创建一个尚不存在的过滤器。该命令的操作方式BF.ADD与之相同,只不过它允许多个输入并返回多个值。格式:BF.MADD {key} {item} [item ...]
。**BF.EXISTS **
: 确定元素是否在布隆过滤器中存在。格式:BF.EXISTS {key} {item}
。BF.MEXISTS
: 确定一个或者多个元素是否在布隆过滤器中存在格式:BF.MEXISTS {key} {item} [item ...]
。
另外,BF.RESERVE
命令需要单独介绍一下:
这个命令的格式如下:
1 | BF.RESERVE {key} {error_rate} {capacity} [EXPANSION expansion] 。 |
下面简单介绍一下每个参数的具体含义:
key
:布隆过滤器的名称error_rate
:误报的期望概率。这应该是介于0到1之间的十进制值。例如,对于期望的误报率0.1%(1000中为1),error_rate
应该设置为0.001。该数字越接近零,则每个项目的内存消耗越大,并且每个操作的CPU使用率越高。capacity
: 过滤器的容量。当实际存储的元素个数超过这个值之后,性能将开始下降。实际的降级将取决于超出限制的程度。随着过滤器元素数量呈指数增长,性能将线性下降。
可选参数:
- expansion:如果创建了一个新的子过滤器,则其大小将是当前过滤器的大小乘以
expansion
。默认扩展值为2。这意味着每个后续子过滤器将是前一个子过滤器的两倍。
3.2 体验
1 | cc@Chirius:/mnt/c/Users/Chirius$ docker exec -it redis-redisbloom bash |
【后面的话】布隆过滤器主要用来解决缓存穿透(大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层)
。一般MySQL 默认的最大连接数在 150 左右,这个可以通过show variables like '%max_connections%';
命令来查看。最大连接数一个还只是一个指标,cpu,内存,磁盘,网络等无力条件都是其运行指标,这些指标都会限制其并发能力!所以,一般3000
个并发请求就能打死大部分数据库了。布隆过滤器是一个非常神奇的数据结构,通过它我们可以非常方便地判断一个给定数据是否存在与海量数据中。我们需要的就是判断key
是否合法。具体是这样做的:把所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来,我会先判断用户发来的请求的值是否存在于布隆过滤器中。不存在的话,直接返回请求参数错误信息给客户端,存在的话才会走具体的业务的流程。