zoukankan      html  css  js  c++  java
  • 概率型数据结构:布隆过滤器

    Bloom Filter作用:是一种概率型的数据结构,可以判断may be contains some value,但是肯定不包含某个value

    比如问题:https://blog.csdn.net/zdxiq000/article/details/57626464

    或者比如redis 缓存击穿,比如我们database中含有1千万条数据,database前加一层缓存,如果没有加上布隆过滤器,那么如果未命中缓存,则直接击穿到database。攻击者可以利用这一点疯狂的访问databse,直至瘫痪。

    解决方案:将database中的一千万条数据跑一遍布隆过滤器。这样,如果一个请求过来后,判断是否在布隆过滤器内,如果在(may be),则按正常的逻辑走,访问database。如果不再,则不再访问database,直接返回即可,这样就减少了对database的无效访问。

    package com.demo;
    
    import com.google.common.hash.Funnels;
    import java.util.HashSet;
    import java.util.Random;
    import com.google.common.hash.BloomFilter;
    
    
    public class TestBloomFilter {
    
        static int sizeOfNumberSet = 1000;
    
        static Random generator = new Random();
    
        public static void main(String[] args) {
            int error = 0;
            HashSet<Integer> hashSet = new HashSet<>();
            BloomFilter<Integer> filter = BloomFilter.create(Funnels.integerFunnel(), sizeOfNumberSet);
    
            for(int i = 0; i < sizeOfNumberSet; i++) {
                int number = generator.nextInt();
                if(filter.mightContain(number) != hashSet.contains(number)) {
                    error++;
                }
                filter.put(number);
                hashSet.add(number);
            }
    
            System.out.println("Error count: " + error + ", error rate = " + String.format("%f", (float)error/(float)sizeOfNumberSet));
        }
    }
  • 相关阅读:
    java基础知识回顾之---java String final类构造方法
    java基础知识回顾之---java String final类普通方法
    递归的理解
    跟着牛人学习
    【轻松学排序算法】眼睛直观感受几种常用排序算法
    《PhotoShop CS6 》第一节 矢量与分辨率
    SQL 查询当天,本月,本周的记录
    SQL创建表脚本
    varchar和Nvarchar区别
    [C#] 我的log4net使用手册
  • 原文地址:https://www.cnblogs.com/iamswf/p/14540160.html
Copyright © 2011-2022 走看看