缓存击穿、BloomFilter 布隆过滤器

缓存击穿的缘由:不法分子 经过伪造查询条件,如:编一些不存在的商品ID,去查询,致使缓存中不存在,跳过缓存,集中访问数据库的状况
private BloomFilter<String> bf =null; //等效成一个set集合

    @PostConstruct //对象建立后,自动调用本方法
    public void init(){//在bean初始化完成后,实例化bloomFilter,并加载数据
        List<Provinces> provinces = this.list();
        //当成一个SET----- 占内存,比hashset占得小不少
        bf = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), provinces.size());// 32个
        for (Provinces p : provinces) {
            bf.put(p.getProvinceid());
        }
    }

    @Cacheable(value = "province")
    public Provinces detail(String provinceid) {
        //先判断布隆过滤器中是否存在该值,值存在才容许访问缓存和数据库
        if(!bf.mightContain(provinceid)){
            System.out.println("非法访问--------"+System.currentTimeMillis());
            return null;
        }
        System.out.println("数据库中获得数据--------"+System.currentTimeMillis());
        Provinces provinces = super.detail(provinceid);
        return provinces;
    }
相关文章
相关标签/搜索