加载布隆过滤器模块
在搭建redis服务的基础上:https://www.cnblogs.com/gabin/p/13652357.html
一、从官网找到module,https://redis.io/modules
二、布隆过滤器源码:https://github.com/RedisBloom/RedisBloom
三、下载源码,并在目录下make编译
四、将编译好的文件:redisbloom.so移到自己喜欢的位置,我放到了redis的可执行目录
五、在redis的配置文件中增加(请注意绝对地址):
loadmodule /opt/redis/redis6/redisbloom.so
六、重启redis服务
使用方式:
- 创建一个过滤器,并增加一个值
- 判断这个值是否存在(请注意布隆过滤器的效果是,可以判断一定不存在,但是不能判断一定存在)
原理大概是:
1、通过映射算法,算出对应6或8位
2、将对应6和8位设置到bitmap中对应的偏移位中
3、根据第二点,如果一个key算出来的位值和其他key重复,则可能出现冲突
4、由于判断存在是根据映射算法,去到对应的bitmap中查看对应是否有值,只要其中一个位值为0,则一定不存在;但是所有位值为1,并不能代表一定存在
比如:
key1算出来, 100 200 300 400 500
key2算出来, 100 201 300 401 500
key3算出来, 101 200 301 400 501
那么如果此时key1不存在,key2和key3存在;这个时候BF.EXISTS key1是存在还是不存在呢?
答案是存在:因为key2和key3的并集正好包含了key1
可是实际上key1存在吗?
答案是:不存在!
另外注意下,这边的布隆过滤器不是用来过滤redis,而是用来过滤数据库(如mysql)。术语的话,就是用来解决缓存击穿问题的,也就是说redis缓存中不存在,但是数据库缓存也不存在的。
这个时候,其实我们是不希望查询数据库的,所以我们提前将mysql中的key是否有值,设置到redis的布隆过滤器中;也就可以在我们将要查询mysql的时候,先提前判断是否不存在,不存在则不去执行mysql数据库查询