布隆过滤器解决Redis缓存穿透

一、Redis缓存穿透

缓存穿透:恶意查询一个数据库中不存在的数据,去缓存层中没有命中数据,进而去mysql中查询数据。

缓存null值,可能会导致Redis中缓存一堆null值。

二、过滤器解决缓存穿透

使用过滤器解决,把不存在的key的请求,拦截住。

问题,key都缓存到内存中,导致内存紧张。

三、布隆过滤器解决缓存穿透

3.1 什么情况下需要布隆过滤器 

先来看几个比较常见的例子

  • 字处理软件中,需要检查一个英语单词是否拼写正确
  • 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上
  • 在网络爬虫里,一个网址是否被访问过
  • yahoo, gmail等邮箱垃圾邮件过滤功能

这几个例子有一个共同的特点: 如何判断一个元素是否存在一个集合中?

3.2 常规思路

  • 数组
  • 链表
  • 树、平衡二叉树、Trie
  • Map (红黑树)
  • 哈希表

虽然,上面描述的这几种数据结构配合常见的排序、二分搜索可以快速高效的处理绝大部分判断元素是否存在集合中的需求。

但是,当集合里面的元素数量足够大,如果有500万条记录甚至1亿条记录呢?这个时候常规的数据结构的问题就凸显出来了。

数组、链表、树等数据结构会存储元素的内容,一旦数据量过大,消耗的内存也会呈现线性增长,最终达到瓶颈

扫描二维码关注公众号,回复: 13419105 查看本文章

有的同学可能会问,哈希表不是效率很高吗?查询效率可以达到O(1)。

但是哈希表需要消耗的内存依然很高。使用哈希表存储一亿 个垃圾 email 地址的消耗?

哈希表的做法:

首先,哈希函数将一个email地址映射成8字节信息指纹;考虑到哈希表存储效率通常小于50%(哈希冲突);

因此消耗的内存:8 * 2 * 1亿 字节 = 1.6G 内存,普通计算机是无法提供如此大的内存。

这个时候,布隆过滤器(Bloom Filter)就应运而生。在继续介绍布隆过滤器的原理时,先讲解下关于哈希函数的预备知识。

3.3 哈希函数

哈希函数的概念是:将任意大小的数据转换成特定大小的数据的函数,转换后的数据称为哈希值或哈希编码。下面是一幅示意图:

可以明显的看到,原始数据经过哈希函数的映射后称为了一个个的哈希编码,数据得到压缩。哈希函数是实现哈希表和布隆过滤器的基础。 

3.4 布隆过滤器解决缓存穿透

具体布隆过滤器原理,参考上一篇:布隆过滤器原理和实现

 参考博客视频教程视频教程

猜你喜欢

转载自blog.csdn.net/qq_38826019/article/details/119965760