“怎么防止缓存击穿?”

这是很多一二线大厂面试的时候考察频率较高的问题。

在并发量较高的系统中,缓存可以提升数据查询的性能,还能缓解后端存储系统的并发压力。可谓是屡试不爽的利器。

我把这个问题的回答,整理到了一个20W字的面试文档里面。大家可以私信我领取。

下面看看高手的回答。

高手:

在实际应用中,我们会在程序和数据库之间增加一个缓存层。

一方面是为了提升数据检索效率,提升程序性能,另一方面是为了缓解数据库的并发压力。

缓存击穿,表示请求因为某些原因全部打到了数据库,缓存并没有起到流量缓冲的作用。

我认为有2种情况会导致缓存击穿。

  • 在Redis里面保存的热点key,在缓存过期的瞬间,有大量请求进来,导致请求全部打在数据库上。

  • 客户端恶意发起大量不存在的key的请求,由于访问的key对应的数据本身就不存在,所以每次必然都会穿透到数据库,导致缓存成为了摆设。

总之,当Redis承担了流量缓冲功能的时候,就需要考虑到Redis失效导致并发压力过大对后端存储设备造成冲击的问题。

因此,我认为可以通过几种方法来解决。

  1. 对于热点数据,我们可以不设置过期时间,或者在访问数据的时候对数据过期时间进行续期。

  2. 对于访问量较高的缓存数据,我们可以设计多级缓存,尽量减少后端存储设备的压力。

  3. 使用分布式锁,当发现缓存失效的时候,不是先从数据库加载,而是先获取分布式锁,获得分布式锁的线程从数据库查询数据后写回到缓存里面。

    后续没有获得锁的线程就只需要等待和重试即可。

    这个方案牺牲了一定的性能,但是确保护了数据库避免被压垮。

  4. 对于恶意攻击类的场景,可以使用布隆过滤器,应用启动的时候把存在的数据缓存到布隆过滤器里面。

    每一次请求进来的时候先访问布隆过滤器,

    如果不存在,则说明这个数据一定没有在数据库里面,就没必要再去访问数据库了。

另外,我们在整个缓存架构设计中,除了尽可能避免缓存穿透的问题,还需要从全局视角做整体考虑

比如业务隔离、多级缓存、部署隔离、安全性考虑等。

总结

在我看来,很多面试题,其实更多的是考察求职者的技术底蕴以及思维边界,有些问题不一定会有答案,或者说在面试的过程中不一定立刻能提出非常好的解决办法我们只需要说大概的方向和思路即可。

大家记得点赞、收藏加关注!!!

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mic带你学架构

如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注「跟着Mic学架构」公众号公众号获取更多技术干货!

【Java面试】怎么防止缓存击穿的问题?的更多相关文章

  1. 【面试突击】-缓存击穿(布隆过滤器 Bloom Filter)

    原文地址:https://blog.csdn.net/fouy_yun/article/details/81075432 前面的文章介绍了缓存的分类和使用的场景.通常情况下,缓存是加速系统响应的一种途 ...

  2. Java Redis缓存穿透/缓存雪崩/缓存击穿,Redis分布式锁实现秒杀,限购等

    package com.example.redisdistlock.controller; import com.example.redisdistlock.util.RedisUtil; impor ...

  3. 使用singleflight防止缓存击穿(Java)

    缓存击穿 在使用缓存时,我们往往是先根据key从缓存中取数据,如果拿不到就去数据源加载数据,写入缓存.但是在某些高并发的情况下,可能会出现缓存击穿的问题,比如一个存在的key,在缓存过期的一刻,同时有 ...

  4. Redis 面试常见问题———缓存雪崩、缓存击穿以及缓存穿透

    在开发中会面临缓存异常可能会出现三个问题,分别是缓存雪崩.缓存击穿和缓存穿透.这三个问题会导致大量请求从缓存转移到数据库,如果请求的并发量很大的话,就会导致数据库崩溃.所以在面试官也会经常问这些问题. ...

  5. 一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.简述MySQL中索引类型对数据库的性能的影响 2.RDB和AOF机制 3.Redis的过期键的删除策略 4.Redis ...

  6. 2019滴滴java面试总结 (包含面试题解析)

    2019滴滴java面试总结  (包含面试题) 本人6年开发经验.今年年初找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.滴滴等公司offer,岗位是既有php也有Java后端开发,最终选择去了滴滴 ...

  7. 2019头条java面试总结 (包含面试题解析)

    2019滴滴java面试总结  (包含面试题) 本人8年开发经验.今年年初找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.滴滴等公司offer,岗位是Java后端开发. 面试了很多家公司,感觉大部分 ...

  8. 2019 奥买家java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.奥买家等公司offer,岗位是Java后端开发,因为发展原因最终选择去了奥买家,入职一年时间了,也成为了面试官 ...

  9. 2019 北森java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.北森等公司offer,岗位是Java后端开发,因为发展原因最终选择去了北森,入职一年时间了,也成为了面试官,之 ...

随机推荐

  1. Java中如何快捷的创建不可变集合

    在Java 9中又新增了一些API来帮助便捷的创建不可变集合,以减少代码复杂度. 本期配套视频:Java 9 新特性:快速定义不可变集合 常规写法 以往我们创建一些不可变集合的时候,通常是这样写的: ...

  2. 论文阅读 dyngraph2vec: Capturing Network Dynamics using Dynamic Graph Representation Learning

    6 dyngraph2vec: Capturing Network Dynamics using Dynamic Graph Representation Learning207 link:https ...

  3. Camunda定时器事件示例Demo(Timer Events)

    ​Camunda定时器事件(Timer Events)是由定义的计时器触发的事件.它们可以用作启动事件.中间事件或边界事件.边界事件可以中断,也可以不中断. Camunda定时器事件包括:Timer ...

  4. 接口偶尔超时,竟又是JVM停顿的锅!

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 继上次我们JVM停顿十几秒的问题解决后,我们系统终于稳定了,再也不会无故重启了! 这是之前的文章:耗时几个月,终于 ...

  5. 送分题,ArrayList 的扩容机制了解吗?

    1. ArrayList 了解过吗?它是啥?有啥用? 众所周知,Java 集合框架拥有两大接口 Collection 和 Map,其中,Collection 麾下三生子 List.Set 和 Queu ...

  6. Mac安装Brew包管理系统

    Mac安装Brew包管理系统 前言 为什么需要安装brew 作为一个开发人员, 习惯了使用centos的yum和ubuntu的apt, 在mac中有没有这两个工具的平替? 有, 就是Brew. Bre ...

  7. SAP 实例 1 Images in HTML

    REPORT zharpo_010 NO STANDARD PAGE HEADING. TABLES : t001. TYPE-POOLS: slis. DATA : w_repid LIKE sy- ...

  8. kali 无线网络渗透测试

    一.无线网络渗透嗅探工具Kismet 如果要进行无线网络渗透测试,则必须先扫描所有有效的无线接入点.在Kali linux中,提供了一款嗅探无线网络工具Kismet.使用该工具可以测量周围的无线信号, ...

  9. 基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  10. Json多层级动态结构数据解析

    一.工具 (1)GSON Google Gson是一个简单的基于Java的库,用于将Java对象序列化为JSON,反之亦然. 它是由Google开发的一个开源库. 以下几点说明为什么应该使用这个库 - ...