【大厂面试必问】Redis 击穿, 穿透, 雪崩, 污染

简介: 【大厂面试必问】Redis 击穿, 穿透, 雪崩, 污染

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家✌

Java知识图谱点击链接:体系化学习Java(Java面试专题)

💕💕 感兴趣的同学可以收藏关注下不然下次找不到哟💕💕

1688468549787.jpg

写在前面

大厂面试必问缓存,缓存必问 Redis,而 Redis 的面试必会问到 “穿击, 穿透, 雪崩, 污染”

1、【缓存击穿】

1.1、什么是缓存击穿

缓存击穿是指在使用缓存系统时,由于某个热点数据过期或不存在,导致大量请求直接访问数据库或其他存储系统,从而造成系统性能下降甚至崩溃的情况。

1.2、场景的场景

常见的缓存击穿场景如下:

  1. 热点数据失效:当一个热点数据在缓存中过期或被删除时,如果此时有大量请求同时访问该数据,缓存无法命中,导致请求直接落到数据库上,引发数据库压力过大。

  2. 不存在的数据请求:当请求一个不存在的数据时,缓存无法命中,请求直接落到数据库上,导致数据库无谓的查询操作。

1.3、如何解决

缓存击穿可以通过以下方式进行缓解:

  1. 设置热点数据的永不过期策略:对于一些热点数据,可以将其设置为永不过期,避免过期导致的缓存击穿。

  2. 加锁机制:当热点数据过期时,可以使用加锁机制,只允许一个请求访问数据库,其他请求等待结果,避免大量请求同时访问数据库。

  3. 异步加载数据:当热点数据过期时,可以使用异步加载的方式,先返回旧数据,然后异步加载新数据并更新缓存,避免请求直接落到数据库上。

  4. 前置缓存:在缓存层之前增加一层前置缓存,用于拦截请求并返回默认值,避免请求直接落到数据库上。

    2、【缓存穿透】

    2.1、什么是缓存穿透

    缓存穿透是指在使用缓存系统时,恶意的请求或者非法的查询导致缓存和数据库都无法命中,从而导致大量请求直接访问数据库,造成系统性能下降甚至崩溃的情况。

    2.2、常见的场景

    缓存穿透的场景如下:

  5. 查询不存在的数据:当恶意请求或者非法查询请求一个不存在的数据时,缓存无法命中,请求直接落到数据库上,导致数据库无谓的查询操作。

  6. 大量请求同时查询不存在的数据:当有大量请求同时查询不存在的数据时,缓存无法命中,请求直接落到数据库上,引发数据库压力过大。

    2.3、如何解决

缓存穿透可以通过以下方式进行缓解:

  1. 布隆过滤器(Bloom Filter):使用布隆过滤器判断请求的数据是否存在于缓存或者数据库中,如果不存在则可以直接拦截请求,避免无谓的查询操作。

  2. 缓存空对象(Cache Null Object):将不存在的数据也存储在缓存中,设置一个较短的过期时间,避免大量请求同时查询不存在的数据。

  3. 接口鉴权和参数校验:对请求进行鉴权和参数校验,过滤掉非法的请求,避免恶意请求对系统造成影响。
    通过以上措施,可以有效缓解缓存穿透问题,提高系统的性能和稳定性。

    3、什么是 【缓存雪崩】

    3.1、什么是缓存雪崩

    缓存雪崩是指在使用缓存系统时,缓存中大量的数据同时失效或者缓存系统不可用,导致大量的请求直接访问数据库,造成数据库压力过大,甚至导致数据库崩溃的情况。

    3.2、常见的场景

缓存雪崩的场景如下:

  1. 缓存数据同时失效:当缓存中的大量数据在同一时间段内失效,导致请求无法命中缓存,直接落到数据库上。

  2. 缓存系统不可用:当缓存系统发生故障或者由于其他原因不可用,请求无法命中缓存,直接落到数据库上。

    3.3、如何解决

    缓存雪崩可以通过以下方式进行缓解:

  3. 设置合理的缓存过期时间:将缓存的过期时间设置为不同的随机值,避免大量数据在同一时间失效。

  4. 分布式锁:在缓存失效时,通过分布式锁来控制只有一个请求去更新缓存,其他请求等待缓存更新完成后再获取数据。

  5. 缓存预热:在系统低峰期,提前主动加载缓存数据,避免在高峰期大量请求直接访问数据库。

  6. 多级缓存:使用多级缓存架构,将热点数据缓存在多级缓存中,减少单一缓存失效的影响范围。

通过以上措施,可以有效缓解缓存雪崩问题,提高系统的稳定性和性能。

4、什么是 【缓存污染】

4.1、什么是缓存污染

缓存污染是指在使用缓存系统时,缓存中存储了错误或无效的数据,导致系统返回不正确的结果或产生异常行为的情况。

4.2、常见的场景

缓存污染的场景如下:

  1. 缓存键冲突:当不同的数据使用相同的缓存键进行缓存时,会导致数据被覆盖或混淆,从而返回错误的结果。

  2. 缓存穿透:当请求的数据在缓存中不存在,而且也不存在于数据库中时,会导致频繁的数据库查询,增加数据库负载。

  3. 缓存击穿:当某个热点数据失效或被删除时,大量的请求同时访问该数据,导致请求直接落到数据库上,增加数据库负载。

    4.3、如何解决

    缓存污染可以通过以下方式进行缓解:

  4. 使用唯一的缓存键:确保不同的数据使用不同的缓存键进行缓存,避免数据混淆或覆盖。

  5. 设置合理的缓存过期时间:根据业务需求设置缓存的过期时间,避免数据过期后仍然被使用。

  6. 缓存穿透处理:对于不存在于缓存和数据库中的请求,可以使用布隆过滤器等技术进行过滤,避免频繁的数据库查询。

  7. 热点数据保护:对于热点数据,可以使用锁机制或者分布式缓存来保护,避免缓存击穿的问题。

通过以上措施,可以有效缓解缓存污染问题,提高系统的稳定性和性能。

1686494501743.jpg

💕💕 本文由激流原创,原创不易,感谢支持
💕💕喜欢的话记得点赞收藏啊

目录
相关文章
|
8月前
|
存储 缓存 NoSQL
Redis常见面试题全解析
Redis面试高频考点全解析:从过期删除、内存淘汰策略,到缓存雪崩、击穿、穿透及BigKey问题,深入原理与实战解决方案,助你轻松应对技术挑战,提升系统性能与稳定性。(238字)
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
11月前
|
存储 NoSQL 定位技术
Redis数据类型面试给分情况
Redis常见数据类型包括:string、hash、list、set、zset(有序集合)。此外还包含高级结构如bitmap、hyperloglog、geo。不同场景可选用合适类型,如库存用string,对象存hash,列表用list,去重场景用set,排行用zset,签到用bitmap,统计访问量用hyperloglog,地理位置用geo。
554 5
|
12月前
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
650 6
|
8月前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
843 25
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
1632 0
|
9月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
371 1
Redis专题-实战篇二-商户查询缓存
|
8月前
|
缓存 运维 监控
Redis 7.0 高性能缓存架构设计与优化
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。
1575 3
|
9月前
|
缓存 NoSQL 关系型数据库
Redis缓存和分布式锁
Redis 是一种高性能的键值存储系统,广泛用于缓存、消息队列和内存数据库。其典型应用包括缓解关系型数据库压力,通过缓存热点数据提高查询效率,支持高并发访问。此外,Redis 还可用于实现分布式锁,解决分布式系统中的资源竞争问题。文章还探讨了缓存的更新策略、缓存穿透与雪崩的解决方案,以及 Redlock 算法等关键技术。
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
383 32

热门文章

最新文章