了解什么是 redis 的雪崩、穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透?

面试官心理分析:

其实这是问到缓存必问的,因为缓存雪崩和穿透,是缓存最大的两个问题,要么不出现,一旦出现就是致命性的问题,所以面试官一定会问你。

 面试题剖析:

缓存雪崩:

对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意外发生了全盘宕机。缓存挂了,此时 1 秒 5000 个请求全部落数据库,数据库必然扛不住,它会报一下警,然后就挂了。此时,如果没有采用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。

这就是缓存雪崩。

京东java研发岗社招二面:什么是 redis 的雪崩、穿透和击穿?

 

大约在 3 年前,国内比较知名的一个互联网公司,曾因为缓存事故,导致雪崩,后台系统全部崩溃,事故从当天下午持续到晚上凌晨 3~4 点,公司损失了几千万。

缓存雪崩的事前事中事后的解决方案如下。 - 事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。 - 事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。 - 事后:redis持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

京东java研发岗社招二面:什么是 redis 的雪崩、穿透和击穿?

用户发送一个请求,系统 A 收到请求后,先查本地 ehcache 缓存,如果没查到再查 redis。如果 ehcache和 redis 都没有,再查数据库,将数据库中的结果,写入 ehcache 和 redis 中。

限流组件,可以设置每秒的请求,有多少能通过组件,剩余的未通过的请求,怎么办?走降级!可以返回一些默认的值,或者友情提示,或者空白的值。

好处: - 数据库绝对不会死,限流组件确保了每秒只有多少个请求能通过。 - 只要数据库不死,就是说,对用户来说,2/5 的请求都是可以被处理的。 - 只要有 2/5 的请求可以被处理,就意味着你的系统没死,对用户来说,可能就是点击几次刷不出来页面,但是多点几次,就可以刷出来一次。

缓存穿透:

对于系统 A,假设一秒 5000 个请求,结果其中 4000 个请求是黑客发出的恶意攻击。

黑客发出的那 4000 个攻击,缓存中查不到,每次你去数据库里查,也查不到。

举个栗子。数据库 id 是从 1 开始的,结果黑客发过来的请求 id 全部都是负数。这样的话,缓存中不会有,请求每次都“视缓存于无物”,直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。

京东java研发岗社招二面:什么是 redis 的雪崩、穿透和击穿?

解决方式很简单,每次系统 A 从数据库中只要没查到,就写一个空值到缓存里去,比如 set -999 UNKNOWN。然后设置一个过期时间,这样的话,下次有相同的 key 来访问的时候,在缓存失效之前,都可以直接从缓存中取数据。

缓存击穿:

缓存击穿,就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。

解决方式也很简单,可以将热点数据设置为永远不过期;或者基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。

2020年最新Redis 面试真题(附上Redis学习思维导图):

京东java研发岗社招二面:什么是 redis 的雪崩、穿透和击穿?

 

  1. Jedis 与 Redisson 对比有什么优缺点?
  2. Redis 如何设置密码及验证密码?
  3. 说说 Redis 哈希槽的概念?
  4. Redis 集群的主从复制模型是怎样的?
  5. Redis 集群会有写操作丢失吗?为什么?
  6. Redis 集群之间是如何复制的?
  7. Redis 集群最大节点个数是多少?
  8. Redis 集群如何选择数据库?
  9. 怎么测试 Redis 的连通性?
  10. 怎么理解 Redis 事务?
  11. Redis 事务相关的命令有哪几个?
  12. Redis key 的过期时间和永久有效分别怎么设置?
  13. Redis 如何做内存优化?
  14. Redis 回收进程如何工作的?
  15. 都有哪些办法可以降低 Redis 的内存使用情况呢?
  16. Redis 的内存用完了会发生什么?
  17. 一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set他们最多能存放多少元素?
  18. MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证redis 中的数据都是热点数据?
  19. Redis 最适合的场景?
  20. 假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?
  21. 如果有大量的 key 需要设置同一时间过期,一般需要注意什么?
  22. 使用过 Redis 做异步队列么,你是怎么用的?
  23. 使用过 Redis 分布式锁么,它是什么回事?

总结:

大厂的面试从来不是一成不变的,所以需要我们掌握熟悉Java基础,底层原理,和有一定的项目实战经验,上面给大家整理总结了大厂经常会问到的一些面试真题,和进阶路线,大家如果真在面试的朋友可以关注微信公众号【Java程序员聚集地】,领取一份我给大家准备的突击面试礼包,千道面试真题,Java核心知识点等海量资料。

 

相关文章:

  • 2021-04-20
  • 2021-09-22
  • 2021-09-13
  • 2021-07-01
  • 2022-12-23
  • 2022-02-11
  • 2021-09-16
  • 2022-02-10
猜你喜欢
  • 2021-05-23
  • 2021-11-30
  • 2022-01-27
  • 2021-04-01
相关资源
相似解决方案