面试怕问到缓存穿透?看这篇就够了

news2024/11/25 20:35:41

面试怕问到缓存穿透?看这篇就够了!

缓存穿透

缓存穿透指的是请求的数据在数据库和缓存中都不存在,这样缓存永远都不会生效,这些请求就会直接打到数据库中。

 

就比方说,你去查询一个商户,带着id为负数的参数去请求,那么这个东西肯定是查不到的,那么redis这层对于数据库的保护伞就永远起不到作用了。如果说有人不怀好意,并发的去请求这个东西,很容易造成数据库挂掉。

那么为了应对 这些不怀好意的人,我们怎么去预防呢?

  • 方案一缓存空对象

     

  • 我们可以对于这个糟糕的请求,如果第一次数据库,redis都没有查询到(未命中),那么我们那就在redis给他去缓存一个空的对象。这样第二次这个糟糕的请求打过来的时候,redis就把刚刚缓存的空对象返回,这样保护伞的作用也就生效了!

    优点:实现简单

    缺点:1. 造成额外内存消耗,缓存了很多垃圾 2. 存在短期的不一致

    有同学可能会好奇,为什么会造成短期的不一致呢?因为,当我们把一个查不到的东西设置成null的时候,redis成为了保护伞,但是如果在此时,我们讲这个查不到的数据给它赋值了,外面的请求如果再想查到,是不是这个时候的redis不再是保护伞,而是一个厚障壁了?

    针对这两个缺点,我们可以通过设置ttl(过期时间)来缓解。

    针对第一个缺点,如果redis中的数据设置为null,那么我们就给他的ttl设置的短一点,这样内存就会定期清理了

    针对第二个缺点,我们同样可以设置短一点的ttl,这样也许2-3min后,我们就又可以访问到数据库了。或者如果我们新增一条数据到数据库,这时候redis不是变成了厚障壁了嘛,那么,我们在新增的同时。把原来为null的那个防御数据删掉,更新成新的数据,也就是说,在新增数据库的同时,更新缓存!这样是不是也能解决数据不一致的问题呢?

  • 方案二布隆过滤

  • 看到这张图,我们会发现,有个叫布隆过滤器的东西,它有什么作用呢?

    原来他会知道所有数据库里面的数据,如果没有该数据,那么布隆过滤器会将它直接打回。

    那么有同学会很好奇,布隆过滤器怎么这么牛,那它岂不是要求存储空间很大?

    原来布隆过滤器,会将数据库里面的数据转化成二进制编码,用0 1的方式来告诉请求方它存不存在,这样其实占据的空间是很小的。这种存在与否是概率上的统计,如果布隆过滤器告诉你,它不存在,那么它一定不存在,那如果它告诉你存在,但其实它不一定存在。

    说到这里,有同学又会疑惑了,既然它有概率无法拦截恶意请求,那么是不是还是有概率被缓存穿透?

    没错,是这样的。没有哪种方案是绝对可靠的,我们需要放到实际的业务场景里仔细分析。

    好的,接下来,我们来总结下布隆过滤器的优缺点:

    • 优点:内存占用少,没有多余的key

    • 缺点:实现起来相对复杂,并且存在误判可能

实战

下面我们将进入一个场景,来实战我们缓存穿透的解决策略。

我们新建了一个表,插入了14条数据

 

如果说此时我们访问id为999的话,肯定是缓存穿透的,下面我们来写缓存穿透的代码

@Override
    public Result queryById(Long id) {
        if(id == null || id < 0){
            return Result.fail("商户为空");
        }
        String key = SHOP_CACHE_KEY + id;
        String shopJson = stringRedisTemplate.opsForValue().get(key);
​
        if(StrUtil.isNotBlank(shopJson)){
            Shop shop = JSONUtil.toBean(shopJson, Shop.class);
            return Result.ok(shop);
        }
​
        if(shopJson != null){
            return Result.fail("别攻击我啦");
        }
​
        Shop shop = getById(id);
​
        if(shop == null){
            stringRedisTemplate.opsForValue().set(key,"",CACHE_NULL_TTL,TimeUnit.MINUTES);
            return Result.fail("未查询到店铺信息");
        }
​
        stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL, TimeUnit.MINUTES);
​
        return Result.ok(shop);
    }

如果这个时候我们访问 id 为 999的商品信息,我们redis中肯定查不到,就会去查数据库,数据库也查不到,我们就设置redis中该id的value为null,过期时间设置的短一些,节省内存空间,然后第二次再访问,redis就会起到保护伞的作用啦,不会到数据库。

我们来测试一下

 

成功!redis向你发送了警告,你别攻击我了!!

防止缓存穿透解决方案总结

  1. 缓存null值,就是我们之前实践的方式。

  2. 布隆过滤

  3. 增强id的复杂度,比如说,限定某个长度,尾缀限定,如果不满足,就直接不进入方法,避免猜测id规律

  4. 做好数据的基础格式校验

  5. 加强用户权限的校验,比如说,不登录就不能去访问某一个接口

  6. 做好热点参数的限流

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

艾美捷SAM甲基转移酶活性分析试剂盒使用前准备方案

关键生物分子和蛋白质的甲基化在许多生物系统&#xff0c;包括信号转导、生物合成、蛋白质修复、基因沉默和染色质调节。S-腺苷甲硫氨酸&#xff08;SAM&#xff09;依赖性甲基转移酶使用SAM ATP后最常用的酶辅因子。SAM&#xff0c;也称为AdoMet作为修饰蛋白质和DNA所需的甲基…

通俗理解决策树

目录前言决策树的结构决策树的构建信息增益&#xff08;ID3算法&#xff09;信息增益率&#xff08;C4.5算法&#xff09;基尼指数&#xff08;CART算法&#xff09;熵VS基尼指数剪枝优缺点及适用场景参考文献前言 从这一期开始&#xff0c;我们准备介绍一系列经典机器学习算法…

Linux:虚拟机配置免密登录和文件同步分发

记录下&#xff0c;以后照抄就好了 文章目录ssh免密登录SCP安全拷贝rsync同步修改xsync集群分发ssh免密登录 免密登录原理 生成公钥和私钥 ssh-keygen -t rsa后连敲三个回车 将公钥拷贝到要免密登录的目标机器上 遇到yes/no的都输入yes ssh-copy-id m1 ssh-copy-id m2 ssh-co…

JAVA毕业设计——基于Springboot+vue的校园二手交易和交流论坛系统(源代码+数据库)

github代码地址 https://github.com/ynwynw/stuSecond-public 毕业设计所有选题地址 https://github.com/ynwynw/allProject 基于Springbootvue的校园二手交易和交流论坛系统(源代码数据库)039 一、系统介绍 这是集校园二手交易、校园交流论坛、校园表白墙为一体的项目。分为…

Java基于微信小程序的新冠疫苗预约小程序 springboot+vue+elementUI

项目介绍 基于小程序的疫苗预约系统是计算机技术与疫苗管理相结合的产物&#xff0c;通过疫苗预约系统实现了对疫苗的高效管理。随着计算机技术的不断提高,计算机已经深入到社会生活的各个角落.而采用人工疫苗预约的方法&#xff0c;不仅效率低&#xff0c;易出错&#xff0c;手…

Python基础(十四):公共操作的讲解

文章目录 公共操作的讲解 一、运算符 1、+ 2、* 3、in或not in 二、公

面了个腾讯35k出来的,他让我见识到什么叫“精通MySQL调优”

始末 MySQL调优对于很多程序员而言&#xff0c;都是一个非常棘手的问题&#xff0c;多数情况都是因为对数据库出现问题的情况和处理思路不清晰。在进行MySQL的优化之前必须要了解的就是MySQL的查询过程&#xff0c;很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能…

CN_@TCP可靠机制@差错控制@流量控制@拥塞控制

文章目录CN_TCP可靠机制差错控制流量控制拥塞控制TCP的可靠性机制序号确认窗口大小和累计确认&#x1f388;Window scaling重传超时冗余ACK&#xff08;冗余确认快速重传&#xff09;差错控制&#x1f388;TCP流量控制&#x1f388;接收窗口:拥塞窗口:发送窗口例例例1例2例3例例…

【Node.js】实现微信小程序订阅消息推送功能

实战项目名称&#xff1a;实现微信小程序订阅消息通知 文章目录一、实战步骤1. 登录微信小程序管理端&#xff0c;添加订阅消息模板2. 定义好需要发送的消息3.获取小程序的access_token4. 发起请求&#xff0c;向用户推送消息4. 小程序端添加接收订阅消息的按钮二、完整源代码三…

基于Python+Django的学生作业提交批改管理系统

在各学校的教学过程中&#xff0c;学生的作业管理是一项非常重要的事情。随着计算机多媒体技术的发展和网络的普及&#xff0c;“基于网络的学习模式”正悄无声息的改变着传统的教室学习模式&#xff0c;“基于网络的教学平台”的研究和设计也成为教育技术领域的热点课题。采用…

ZeroTier实现内网穿透详细教程,其实5分钟就可以搞定

想看更详细的视频教程&#xff0c;推荐到哔哩哔哩上看&#xff1a;强大的内网穿透工具ZeroTier&#xff0c;随时随地远程访问家中NAS和其它设备&#xff01;没有公网IP也不怕_哔哩哔哩_bilibili 相信很多人都有远程连接家中设备的需求&#xff0c;如远程连接家中的NAS、Window…

基于JAVA的书舍管理系统的设计与实现

摘 要 随着图书馆规模的不断扩大&#xff0c;人流数量的急剧增加&#xff0c;有关图书馆的各种信息量也在不断成倍增长。面对庞大的信息量&#xff0c;就需要有书舍管理系统来提高图书馆工作的效率。通过这样的系统&#xff0c;我们可以做到信息的规范管理和快速查询&#xff…

python 算法加密

加密代码片段样例 文件名&#xff1a;iter_n.py import timedef iter_from_n(n):list_n []for index,value in enumerate(range(n)):list_n.append([index,value])return list_nif __name__"__main__":t1 time.time()iter_from_n(100000)t2 time.time()print (&…

精彩预告 | 美创科技与您线上相约第十三届中国数据库技术大会

12月14日~16日&#xff0c;由IT168联合旗下ITPUB、ChinaUnix两大技术社区主办的第13届中国数据库技术大会&#xff08;DTCC2022&#xff09;将在线上隆重召开。 作为一家在数据库技术领域深研探索十余年的厂商&#xff0c;美创科技持续专注推动数据库技术的发展与实践。此次大会…

在平台上便捷使用LS-DYNA的方式

LS-DYNA 由Livermore Software Technology Corporation (LSTC) 开发&#xff0c;是一种多用途的显式和隐式有限元和多物理场程序&#xff0c;用于分析结构的非线性响应&#xff1b;其全自动接触分析和广泛的材料模型使全球用户能够解决复杂的现实问题。 这里要注意的是&#x…

【Vue】Vue2基本使用

文章目录一、模板语法1、插值语法写法介绍2、指令语法写法介绍模板语法示例二、数据绑定介绍数据绑定示例效果三、初始化Vue时&#xff0c;data属性与el属性的两种写法el的两种写法data的两种写法演示案例四、MVVM模型介绍五、数据代理JS数据代理案例演示Vue数据代理介绍原理六…

汽车自动驾驶的L0-L5是什么意思?

一、问题 汽车L0、L1、L2、L3、L4、L5自动驾驶都是什么意思呢&#xff1f; 近年来「自动驾驶」对我们来说不再陌生&#xff0c;很多人虽然早有所闻&#xff0c;但是真不懂自动驾驶的L0、L1、L2、L3、L4、L5是什么意思&#xff0c;都有哪些功能&#xff0c;今天就来为大家科普一…

什么蓝牙耳机质量好?公认最好用的蓝牙耳机推荐

现如今&#xff0c;蓝牙耳机在人们的日常使用设备当中扮演着较为重要的角色。无论是听歌、玩游戏、追剧、通话等&#xff0c;都可以通过蓝牙耳机来实现。而蓝牙耳机因为摆脱了线的束缚&#xff0c;日常携带会更便捷。作为一名耳机发烧友&#xff0c;今天来给大家分享几款公认最…

[附源码]Python计算机毕业设计SSM基于大数据的超市进销存预警系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

7 种模型加权集成方法

# 7 种模型加权集成方法 不同任务 -> 不同加权方法 分类 类别投票概率值加权 回归 预测值加权 排序 排序次序加权 目标检测 预测结果NMS 语义分割 像素类别投票加权 集成学习 考虑 模型的多样性 多样性不足 -> 最终预测结果和单个模型类似。 模型的精度差异…