千家信息网

redis缓存穿透怎么理解

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"redis缓存穿透怎么理解",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"redis缓存穿透怎么理解"吧!Bloom Filter 概念布
千家信息网最后更新 2026年11月03日redis缓存穿透怎么理解

本篇内容主要讲解"redis缓存穿透怎么理解",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"redis缓存穿透怎么理解"吧!

Bloom Filter 概念

布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

Bloom Filter 原理

布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。

Bloom Filter跟单哈希函数Bit-Map不同之处在于:Bloom Filter使用了k个哈希函数,每个字符串跟k个bit对应。从而降低了冲突的概率。

缓存穿透

(2)哈希函数选择

由预估数据量n以及bit数组长度m,可以得到一个hash函数的个数k:

img

哈希函数的选择对性能的影响应该是很大的,一个好的哈希函数要能近似等概率的将字符串映射到各个Bit。选择k个不同的哈希函数比较麻烦,一种简单的方法是选择一个哈希函数,然后送入k个不同的参数。

哈希函数个数k、位数组大小m、加入的字符串数量n的关系可以参考Bloom Filters - the math,Bloom_filter-wikipedia

要使用BloomFilter,需要引入guava包:

             com.google.guava            guava            23.0 

测试分两步:

1、往过滤器中放一百万个数,然后去验证这一百万个数是否能通过过滤器

2、另外找一万个数,去检验漏网之鱼的数量

/** * 测试布隆过滤器(可用于redis缓存穿透) */public class TestBloomFilter {    private static int total = 1000000;    private static BloomFilter bf = BloomFilter.create(Funnels.integerFunnel(), total);//    private static BloomFilter bf = BloomFilter.create(Funnels.integerFunnel(), total, 0.001);    public static void main(String[] args) {        // 初始化1000000条数据到过滤器中        for (int i = 0; i < total; i++) {            bf.put(i);        }        // 匹配已在过滤器中的值,是否有匹配不上的        for (int i = 0; i < total; i++) {            if (!bf.mightContain(i)) {                System.out.println("有坏人逃脱了~~~");            }        }        // 匹配不在过滤器中的10000个值,有多少匹配出来        int count = 0;        for (int i = total; i < total + 10000; i++) {            if (bf.mightContain(i)) {                count++;            }        }        System.out.println("误伤的数量:" + count);    }}

运行结果:

运行结果表示,遍历这一百万个在过滤器中的数时,都被识别出来了。一万个不在过滤器中的数,误伤了320个,错误率是0.03左右。

看下BloomFilter的源码:

public static  BloomFilter create(Funnel funnel, int expectedInsertions) {        return create(funnel, (long) expectedInsertions);    }      public static  BloomFilter create(Funnel funnel, long expectedInsertions) {        return create(funnel, expectedInsertions, 0.03); // FYI, for 3%, we always get 5 hash functions    }    public static  BloomFilter create(          Funnel funnel, long expectedInsertions, double fpp) {        return create(funnel, expectedInsertions, fpp, BloomFilterStrategies.MURMUR128_MITZ_64);    }    static  BloomFilter create(      Funnel funnel, long expectedInsertions, double fpp, Strategy strategy) {     ......    }

BloomFilter一共四个create方法,不过最终都是走向第四个。看一下每个参数的含义:

  1. funnel:数据类型(一般是调用Funnels工具类中的)

  2. expectedInsertions:期望插入的值的个数

  3. fpp 错误率(默认值为0.03)

  4. strategy 哈希算法(我也不懂啥意思)Bloom Filter的应用

在最后一个create方法中,设置一个断点:

上面的numBits,表示存一百万个int类型数字,需要的位数为7298440,700多万位。理论上存一百万个数,一个int是4字节32位,需要481000000=3200万位。如果使用HashMap去存,按HashMap50%的存储效率,需要6400万位。可以看出BloomFilter的存储空间很小,只有HashMap的1/10左右

上面的numHashFunctions,表示需要5个函数去存这些数字

使用第三个create方法,我们设置下错误率:

private static BloomFilter bf = BloomFilter.create(Funnels.integerFunnel(), total, 0.0003);

再运行看看:

当错误率设为0.0003时,所需要的位数为16883499,1600万位,需要12个函数

和上面对比可以看出,错误率越大,所需空间和时间越小,错误率越小,所需空间和时间约大

常见的几个应用场景:

  • cerberus在收集监控数据的时候, 有的系统的监控项量会很大, 需要检查一个监控项的名字是否已经被记录到db过了, 如果没有的话就需要写入db.

  • 爬虫过滤已抓到的url就不再抓,可用bloom filter过滤

  • 垃圾邮件过滤。如果用哈希表,每存储一亿个 email地址,就需要 1.6GB的内存(用哈希表实现的具体办法是将每一个 email地址对应成一个八字节的信息指纹,然后将这些信息指纹存入哈希表,由于哈希表的存储效率一般只有 50%,因此一个 email地址需要占用十六个字节。一亿个地址大约要 1.6GB,即十六亿字节的内存)。因此存贮几十亿个邮件地址可能需要上百 GB的内存。而Bloom Filter只需要哈希表 1/8到 1/4 的大小就能解决同样的问题。

到此,相信大家对"redis缓存穿透怎么理解"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

哈希 函数 过滤器 个数 错误 错误率 布隆 缓存 穿透 元素 地址 方法 位数 字节 数据 空间 存储 选择 不同 内存 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技有限公司 互联网佳科技有限公司 壹账通互联网科技 美国互联网黑科技 掌上梦互联网科技 多迪互联网科技有限公司 安控科技rtu产品工业互联网 互联网实体化科技化 未来五年的互联网科技 广州市恰铎互联网科技有限公司 链环科技传统企业怎么转型互联网 浙南科技城互联网大厦建设工程 上海创道互联网络科技有限公司 唯美互联网科技 求路客互联网科技电话 众联互联网络科技 数字互联网科技有限公司 第三届互联网大会安防黑科技 恒生科技指数 中概互联网 小牛互联网科技有限公司地址 互联网科技活动banner 互联网科技巨头监管 互联网下的科技发展 央行互联网金融科技公司 广州恒生互联网科技有限 贵州叶脉互联网科技有限公司所属行业 宝灵互联网科技有限公司 青岛科技大学互联网大赛研究生 南通创西澳互联网科技有限公司 江苏互联网智能科技软件
0