springboot 实现布隆过滤器防止黑客攻击

问题:黑客拿不存在的id请求后端接口,在redis数据库中找不到该id的信息则会去mysql数据库中查询。如果黑客发起大量请求请求数据库是会导致缓存击穿,从而使服务瘫痪。
解决办法:使用布隆过滤器。

springboot 实现布隆过滤器防止黑客攻击_第1张图片

布隆过滤器的优点:
1.简单好用。
2.存储量小,几千万个id可能所占用的内存为几兆到几十兆,如果使用常规的数据库来保存的话可能需要几百G到上T的存储空间。
3.查询速度快。

1.将存在的id放入布隆过滤器中。
2.在通过id查询数据的接口中加入该id是否存在于布隆过滤器中,如果不存在则说明该id在数据库中没有,可不用查询mysql数据库。

static  BloomFilter<String> bloomFilter =BloomFilter.create(Funnels.stringFunnel(Charset.forName("utf-8")),1000,0.001);
    @GetMapping("/bloomFilter")
    @ApiOperation("布隆过滤器")
    public ResponseResult bloomFilter(){
     
        List<String> allResourceId = resCenterDao.getAllResourceId();
        for (String id : allResourceId) {
     
                //将所有的资源id放入到布隆过滤器中
            bloomFilter.put(id);
        }
        return new ResponseResult(ResponseEnum.SUCCESS);
    }

使用时只用判断为true即可


    @GetMapping("/bloomFilter/resourceId")
    @ApiOperation("布隆过滤器资源测试")
    public ResponseResult bloomFilterResourceId(@RequestParam("resourceId")String resourceId){
     
        boolean mightContain = bloomFilter.mightContain(resourceId);
        if (!mightContain){
     
            return new QueryResult<>(ResCenterEnum.RESOURCE_EXSIT,"");
        }
        return new ResponseResult(ResponseEnum.SUCCESS);
    }

说明:

 List<String> allResourceId = resCenterDao.getAllResourceId();

这一步是从数据库中获取某张表所有的id,那么会存在一个问题,该表的数据会新增,导致布隆过滤器中的id不是最新的。解决办法就是在新增数据,将表的id及时加入到布隆器中。

你可能感兴趣的:(springcloud,redis,技术)