面试题:Redis如何防止缓存穿透 + 布隆过滤器原理

题目来源

招银网络-技术-1面

题目描述

  • 缓存穿透是什么?
  • 如何防止缓存穿透
  • 布隆过滤器的原理是什么?

我的回答

  • 缓存穿透是什么?
    攻击者大量请求缓存和数据库中都不存在的key。
  • 如何防止缓存穿透
    可以使用布隆过滤器
  • 布隆过滤器的原理是什么?
    记不太清楚了

更好的答案

  • 布隆过滤器的使用流程
    使用bitmap来存储合法的的商品id。
    当请求到达服务器之后,如果缓存中没有,则不直接访问数据库,而是先通过布隆过滤器进行筛选,如果通过了布隆过滤器的筛选,则可以去查询数据库了,查出来了之后,再放入缓存,并返回给客户端。
  • 布隆过滤器的原理
    在这个问题的场景下,我们是把布隆过滤器当做白名单来使用,只有布隆过滤器里面存在的商品id,才能通过过滤,然后去访问数据库。
    要实现时间复杂度为1的过滤,只能使用哈希算法,但是哈希算法经常会产生碰撞,就会产生误判。
    所以,布隆过滤器采用了多种哈希算法,当要查询一个商品id是否在白名单中时,布隆过滤器会计算hash_1(id), hash_2(id), hash_3(id)…hash_n(id),把所有计算出来的哈希值对bitmap的总位数取余,然后判断是否所有的取余之后的结果,都在bitmap中,如果都在,那该商品id通过过滤,如下所示,qqcr1为合法id,可以去请求数据库了。
    在这里插入图片描述
    布隆过滤器是如何初始化的呢?答案是将所有的合法的商品id经过布隆过滤器定义的哈希函数计算之后,对bitmap的位数取余,然后将该bit位设置为1,如下图所示
    在这里插入图片描述

如果有任何一个hash算法的结果取余之后不在bit毛中,则该商品id一定是攻击者伪造的,就不能去请求数据库,如下所以,qqcr2为非法id。
在这里插入图片描述

  • 布隆过滤器的优点
    使用bitmap来存储白名单,节省空间,并且计算哈希的时间复杂度是1,在判断商品是否存在时,可以使用如下方法:
    获取哈希函数值,对bitmap总位数取余,假如结果为3和1,然后利用位运算,将一个int类型或者long类型的字面量1左移两位和1位,就可以得到100,010,将100和010做位运算或运算,就可以得到110,然后将110与bitmap做位运算与操作,如果结果大于0,则通过布隆过滤器的过滤,就可以去数据库查询了。当然,上述过滤操作是我自己猜想的,真正的布隆过滤器,肯定不止有int的32位或者long的64位,具体的需要去查找怎么做的布隆过滤器。

  • 布隆过滤器的缺点
    – 缺点1:可能会发生误判的情况
    现在有两个合法商品id,id_1和id_2,一个不合法的商品id为id_3,有两个hash函数,计算出来的bitmap如下
    在这里插入图片描述
    id_3计算出来的bit位如下,可以看到id_3计算的bit位跟id_1和id_2的bit位产生了碰撞,则id_3可以通过布隆过滤器的过滤,产生误判。
    有没有什么办法可以解决这个误判的问题呢?
    如果只使用一个布隆过滤器来存储商品白名单,则不行,因为哈希碰撞肯定会存在。有另一个思路,我们可以通过增加bitmap的长度与增加哈希函数的个数,缓解哈希碰撞,从而缓解误判的概率。但是,需要注意的是,增加bitmap会占用更多的存储空间,增加哈希函数,需要进行更多次的计算,会占用更多的CPU时间片。
    在这里插入图片描述

    – 缺点2:删除数据困难,假如bitmap已经初始化好了,如果后台管理员删除了某几个商品,则布隆过滤器不能直接将该商品对应的bit位设置为0,因为其他商品计算出来的bit位可能跟被删除的商品一致。所以我们可以采取定期重新初始化布隆过滤器的策略,在某些商品被删除到重新初始化期间,可能会出现误判。

遗留问题

怎么初始化布隆过滤器,布隆过滤器在代码中怎么使用?
布隆过滤器这个数据结构,是存在redis当中?还是存在我们写得Java服务当中?

参考

bilibili视频-徐庶老师-面试官:说说布隆过滤器怎么解决缓存穿透的?

小林coding:什么是缓存雪崩、击穿、穿透?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/641032.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS - Runloop在实际开发中的应用

文章目录 iOS - Runloop在实际开发中的应用1. 控制线程生命周期(线程保活)2. 解决NSTimer在滑动时停止工作的问题2.1. 案例2.2 解决 3. 监控应用卡顿4. 性能优化 iOS - Runloop在实际开发中的应用 1. 控制线程生命周期(线程保活)…

(一)Java EE企业级应用开发实战之Servlet教程——JDK安装

首先打开清华大学开源软件镜像站,清华大学开源镜像网站地址为: https://mirrors.tuna.tsinghua.edu.cn/ 打开该地址后的界面显示如下图所示 找到8版本对应的SDK安装包,我现在用的开发机器是Windows,所以我找的是Windows对应的版本…

Redis入门到通关之Redis数据结构-Set篇

文章目录 ☃️概述☃️数据结构☃️源码☃️其他 欢迎来到 请回答1024 的博客 🍓🍓🍓欢迎来到 请回答1024的博客 关于博主: 我是 请回答1024,一个追求数学与计算的边界、时间与空间的平衡,0与1的延伸的后端…

Nginx part2.2

目录 如何用Nginx搭建多网址服务器? 基于ip地址的虚拟主机 1. 先建立存储网页的目录 2.进行子配置 3.编写.conf文件 基于端口号的虚拟主机 基于域名的虚拟主机 如何用Nginx搭建多网址服务器? 有些网站,ip不同,域名不同&…

Opencv | 图像卷积与形态学变换操作

这里写目录标题 一. 滤波 / 卷积操作1. 平滑均值滤波/卷积2. 平滑中值滤波/卷积3. 平滑高斯滤波/卷积3.1 关注区域3.2 分解特性 二. 形态学变换1. 常用核2. cv.erode ( ) 腐蚀操作3. cv.dilate ( ) 膨胀操作4. Open 操作5. Close 操作6. Morphological Gradient 形态梯度操作7.…

基于postCSS手写postcss-px-to-vewiport插件实现移动端适配

🌟前言 目前前端实现移动端适配方案千千万,眼花缭乱各有有缺,但目前来说postcss-px-to-vewiport是一种非常合适的实现方案,postcss-px-to-vewiport是一个基于postCss开发的插件,其原理就是将项目中的px单位转换为vw(视…

向量的点积和叉积的几何意义

1. 点积 点积(dot product),又称标量积(scalar product)。结果等于。 可用于 判断的是否垂直求投影长度求向量是抑制作用还是促进作用 2. 叉积 叉积(cross product),又称为向量积(vector product)。模长等于,方向…

深入剖析机器学习领域的璀璨明珠——支持向量机算法

在机器学习的广袤星空中,支持向量机(Support Vector Machine,简称SVM)无疑是一颗璀璨的明珠。它以其独特的分类能力和强大的泛化性能,在数据分类、模式识别、回归分析等领域大放异彩。本文将详细剖析SVM算法的原理、特…

政安晨:【Keras机器学习示例演绎】(十)—— 用于读取验证码的 OCR 模型

目录 简介 设置 加载数据验证码图像 预处理 创建数据集对象 将数据可视化 模型 培训 推理 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益,如有不足之…

HTML随机点名程序

案例要求 1.点击点名按钮&#xff0c;名字界面随机显示&#xff0c;按钮文字由点名变为停止 2.再次点击点名按钮&#xff0c;显示当前被点名学生姓名&#xff0c;按钮文字由停止变为点名 案例源码 <!DOCTYPE html> <html lang"en"> <head> <m…

03-JAVA设计模式-中介者模式

中介者模式 什么是中介者模式 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为设计模式&#xff0c;用于减少对象之间的直接依赖关系&#xff0c;降低它们之间的耦合度&#xff0c;并使得一个对象改变时&#xff0c;所有依赖于它的对象都得到通知并自动更新。…

【计算机组成原理】浮点运算方法和浮点运算器

浮点加法、减法运算 浮点数加减法的步骤结合题目分析步骤 浮点数加减法的步骤 ① 0 操作数检查 ② 比较阶码大小&#xff0c;完成对阶 ③ 尾数进行加减法运算 ④ 结果规格化 ⑤ 舍入处理 ⑥ 判断结果是否溢出 结合题目分析步骤 例&#xff1a;设 x 2010 0.11011011&#x…