Redis解读(4):Redis中HyperLongLog、布隆过滤器、限流、Geo、及Scan等进阶应用 (2)

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

Redis解读(4):Redis中HyperLongLog、布隆过滤器、限流、Geo、及Scan等进阶应用

当判断元素是否粗存在时,依然先对元素进行 hash 运算,将运算的结果和位数组取模,然后去对应的
位置查看是否有相应的数据,如果有,表示元素可能存在(因为这个有数据的地方也可能是其他元素存
进来的),如果没有表示元素一定不存在。

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

4.Bloom Filter 安装

布隆过滤器插件官方网站:https://oss.redislabs.com/redisbloom/Quick_Start/

这边主要介绍三种安装方式

Docker,指定容器映射端口和别名启动

docker run -p 6379:6379 --name redis-redisbloom redislabs/rebloom:latest

Git 克隆编译安装启动

cd redis-6.2.1 git clone https://github.com/RedisBloom/RedisBloom.git cd RedisBloom/ make cd .. redis-server redis.conf --loadmodule ./RedisBloom/redisbloom.so

上传tar包,解压安装启动

cd redis-6.2.1 tar -zxvf RedisBloom-2.2.5.tar.gz mv ./RedisBloom-2.2.5 /home/redis-6.2.1/RedisBloom redis-server redis.conf --loadmodule ./RedisBloom/redisbloom.so

安装完成后,执行 bf.add 命令,测试安装是否成功。

每次启动时都输入 redis-server redis.conf --loadmodule ./RedisBloom/redisbloom.so 比较
麻烦,我们可以将要加载的模块在 redis.conf 中提前配置好。

################################## MODULES ##################################### # Load modules at startup. If the server is not able to load modules # it will abort. It is possible to use multiple loadmodule directives. # # loadmodule /path/to/my_module.so # loadmodule /path/to/other_module.so loadmodule /root/redis-5.0.7/RedisBloom/redisbloom.so

最下面这一句,配置完成后,以后只需要 redis-server redis.conf 来启动 Redis 即可

5.基本用法

主要是两类命令,添加和判断是否存在。

bf.add 添加

bf.madd 批量添加

bf.exists 判断是否存在

bf.mexists 批量判断

#命令使用示例 127.0.0.1:6379> BF.ADD k1 v1 (integer) 1 127.0.0.1:6379> BF.EXISTS k1 v1 (integer) 1 127.0.0.1:6379> BF.EXISTS k1 v2 (integer) 0 127.0.0.1:6379> BF.MADD k1 v1 v2 v3 v4 1) (integer) 0 2) (integer) 1 3) (integer) 1 4) (integer) 1 127.0.0.1:6379> BF.MEXISTS k1 v1 v2 v3 v4 v5 1) (integer) 1 2) (integer) 1 3) (integer) 1 4) (integer) 1 5) (integer) 0 127.0.0.1:6379>

使用 Jedis 操作布隆过滤器,首先添加依赖:

<dependency>   <groupId>com.redislabs</groupId>   <artifactId>jrebloom</artifactId>   <version>1.2.0</version> </dependency>

进行测试:

package org.taoguoguo.bloom; import io.rebloom.client.Client; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import redis.clients.jedis.JedisPool; /** * @author taoguoguo * @description BloomFilter * @website https://www.cnblogs.com/doondo * @create 2021-04-21 21:04 */ public class BloomFilter { public static void main(String[] args) { GenericObjectPoolConfig config = new GenericObjectPoolConfig(); config.setMaxIdle(300); config.setMaxTotal(1000); config.setMaxWaitMillis(30000); config.setTestOnBorrow(true); JedisPool pool = new JedisPool(config, "192.168.124.5", 6379, 30000, "123456"); Client client = new Client(pool); //存入数据 for (int i = 0; i < 100000; i++) { client.add("name", "taoguoguo-"+ i ); } //判断是否存在 boolean exists = client.exists("name", "taoguoguo-9"); System.out.println(exists); } }

控制台打印:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See #StaticLoggerBinder for further details. true

布隆过滤器 存在是有可能会误判断的,我们将判断数量加大,尝试执行多次,是会存在误判的。所以布隆过滤器判断不存在时一定准确,判断存在时不一定准确。

6.参数配置

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzdxwg.html