緩存擊穿、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;
    }
相關文章
相關標籤/搜索