利用redis实现分布式的布隆过滤器,过滤无效请求

摘要: 对于布隆过滤器本身是什么,怎么实现的,网上已经有很多解释了。而且网上很多举例用的是google 的 guava ,对于单机应用,用guava 肯定没什么问题。但现在的系统都是微服务,或者分布式架构的。这种情况下,需要多台服务器共享数据,这个时候,redis的优势就体现出来了。本文利用redis来实现共享的布隆过滤器

对于布隆过滤器本身是什么,怎么实现的,网上已经有很多解释了。而且网上很多举例用的是google 的 guava ,对于单机应用,用guava 肯定没什么问题。但现在的系统都是微服务,或者分布式架构的。这种情况下,需要多台服务器共享数据,这个时候,redis的优势就体现出来了。本文利用redis来实现共享的布隆过滤器。

一. 引入Redis响应的包

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

二. 将RedissonClient注入到spring容器中.

@Configuration
public class RedissionClientBean {

    @Bean
    public RedissonClient redissonClient(){
        //创建Config
        Config config = new Config();
        //测试用单机模式,生产环境用集群实现
        config.useSingleServer().setAddress("redis://192.168.222.150:6379");

        return Redisson.create(config);
    }

}

三. 在项目启动的时候,把白名单URL增加到布隆过滤器中

@Component
public class InitBloomUrl implements ApplicationRunner {

    @Autowired
    RedissonClient redissionClient;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        RBloomFilter<Object> urlBloomFilter = redissionClient.getBloomFilter("url_filter");
        urlBloomFilter.tryInit(1000000,0.00001);
        urlBloomFilter.add("/provider/categories");
        urlBloomFilter.add("/provider/goods");
        urlBloomFilter.add("/provider/user/*");
    }
}

四. 当用户访问的时候,在拦截器中,利用布隆过滤器判断URL是否是有效请求. 不同的项目,可能有不同的开发方式,但一般用拦截器,比如类似如下的方法。

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    ServerHttpRequest request = exchange.getRequest();
    String path = request.getURI().getPath();

    RBloomFilter<Object> urlFilter = redissonClient.getBloomFilter("url_filter");
    if (urlFilter.contains(path)) {
        logger.info("yes it exists");
    }

    logger.info("====全局过滤器=====, path: {}", path);

    return chain.filter(exchange);
}

这样就实现了基于redis的分布式布隆过滤器。

上一篇: spring boot结合redis实现限流
下一篇: 在 ubuntu 上安装MySQL 之后可能遇到的坑

Avatar

热搜 评论于: 2021-05-11

文章不错支持一下
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号