Redisson的布隆过滤器

发布于:2025-07-28 ⋅ 阅读:(18) ⋅ 点赞:(0)

布隆过滤器用来判断某个元素是否存在。

使用场景

解决redis缓存穿透,当判断不存在该数据时,直接返回;

垃圾邮箱过滤;

防止内容的重复推荐;

避免爬取相同的URL等等

基本算法

给出一个长度是n的数组,元素的值是0或者1;

向布隆过滤器中添加元素时,根据m个hash函数对元素进行运算,得到m个位置;

将这m个位置的元素设置为1;

判断某个元素是否存在时,也是根据m个hash函数进行运算,如果m个位置的元素都为1,说明元素存在,只要某个位置存在一个0,则说明不存在。

由于hash冲突,布隆过滤器可以判断元素一定不存在,但是不能保证一定存在,其存在一定的误判率。

注:图片来自网络

导入jar

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.18.0</version>
        </dependency>

配置类

package com.qfedu.redissontest.config;

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RedissonConfig {
    @Bean
    public RedissonClient getRedisson() {
        Config config = new Config();
        config.useSingleServer()
                .setAddress("redis://127.0.0.1:6379")
                .setDatabase(7)
                .setRetryInterval(5000)
                .setTimeout(10000)
                .setConnectTimeout(10000);
        return Redisson.create(config);
    }
}

测试

    @Test
    void contextLoads() {
        RBloomFilter<Long> bloomFilter = redisson.getBloomFilter("sample");
        // 初始化布隆过滤器,预计统计元素数量为10000,期望误差率为0.01
        bloomFilter.tryInit(10000L, 0.01);
        bloomFilter.add(123L);
        bloomFilter.add(234L);
        boolean contains = bloomFilter.contains(123L);
        System.out.println(contains);

    }


网站公告

今日签到

点亮在社区的每一天
去签到