加载布隆过滤器模块

在搭建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数据库查询

原文地址:https://www.cnblogs.com/gabin/p/13663898.html