加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 湛江站长网 (https://www.0759zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营 > 正文

Redis缓存三大问题解析,看完保你面试能造火箭,工作能拧螺丝。

发布时间:2020-12-26 05:06:53 所属栏目:运营 来源:网络整理
导读:副标题#e# 前言 日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题。 ?面试10家公司,收获9个offer,2020年PHP 面试问题 一旦涉及大数据量的需求,如一些商品抢购的情景,或

Redis缓存三大问题解析,看完保你面试能造火箭,工作能拧螺丝。

经过查询后,发现2和13位置所存储的值都为1,但是2和13的下标分别是x和z经过计算后的下标位置的修改,该布隆过滤器中实际不存在a,那么布隆过滤器就会误判改值可能存在,因为布隆过滤器不存元素值,所以存在误判率。

那么具体布隆过布隆过滤的判断的准确率和一下两个因素有关:

  1. 布隆过滤器大小:越大,误判率就越小,所以说布隆过滤器一般长度都是非常大的。
  2. 哈希函数的个数:哈希函数的个数越多,那么误判率就越小。

那么为什么不能删除元素呢?

原因很简单,因为删除元素后,将对应元素的下标设置为零,可能别的元素的下标也引用改下标,这样别的元素的判断就会收到影响,原理图如下:

Redis缓存三大问题解析,看完保你面试能造火箭,工作能拧螺丝。

当你删除z元素之后,将对应的下标10和13设置为0,这样导致x和y元素的下标受到影响,导致数据的判断不准确,所以直接不提供删除元素的api。

以上说的都是布隆过滤器的原理,只有理解了原理,在实际的运用才能如鱼得水,下面就来实操代码,手写一个简单的布隆过滤器。

对于要手写一个布隆过滤器,首先要明确布隆过滤器的核心:

  • 若干哈希函数
  • 存值得Api
  • 判断值得Api

实现得代码如下:

public class MyBloomFilter {
    // 布隆过滤器长度
    private static final int SIZE = 2 << 10;
    // 模拟实现不同的哈希函数
    private static final int[] num= new int[] {5,19,23,31,47,71};   
    // 初始化位数组
    private BitSet bits = new BitSet(SIZE);
    // 用于存储哈希函数
    private MyHash[] function = new MyHash[num.length];
// 初始化哈希函数
public MyBloomFilter() {
    for (int i = 0; i < num.length; i++) {
        function [i] = new MyHash(SIZE,num[i]);
    }
}

// 存值Api 
public void add(String value) {
    // 对存入得值进行哈希计算
    for (MyHash f: function) {
        // 将为数组对应的哈希下标得位置得值改为1
        bits.set(f.hash(value),true);
    }
}

// 判断是否存在该值得Api 
public boolean contains(String value) {
    if (value == null) {
        return false;
    }
    boolean result= true;
    for (MyHash f : func) {
        result= result&& bits.get(f.hash(value));
    }
    return result;
}

}

  

(编辑:PHP编程网 - 湛江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!