问题:黑客拿不存在的id请求后端接口,在redis数据库中找不到该id的信息则会去mysql数据库中查询。如果黑客发起大量请求请求数据库是会导致缓存击穿,从而使服务瘫痪。
解决办法:使用布隆过滤器。
布隆过滤器的优点:
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及时加入到布隆器中。
版权声明:本文为weixin_43748936原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。