面试官:谈关于缓存穿透+击穿+雪崩,以及热点数据失效问题的解决方案

最后

给大家送一个小福利

附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

缓存空对象会有两个问题:

  • 第一,空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间 ( 如果是攻击,问题更严重 ),比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。

  • 第二,缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如过期时间设置为 5分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。

2.3.2用布隆过滤器BloomFilter

======================

BloomFilter类似于一个hbase set用来判断某个元素(key)是否存在于某个集合中。

这种方式在大数据场景应用比较多,比如Hbase中使用它去判断数据是否在磁盘上。还有在爬虫场景判断url是否已经被爬取过。

这种方案可以加在第一种方案中,在缓存之前加一层BloomFilter,在查询的时候先去BloomFilter去查询key是否存在,如果不存在就直接返回,存在再去查缓存-------->差数据库。

流程图如下:

面试官:谈关于缓存穿透+击穿+雪崩,热点数据失效问题的解决方案

2.4如何选择

=======

针对于一些恶意攻击,攻击带来大量key是不存在的,那么我们采用第一种方案就会缓存大量不存在的数据。此时我们采用第一种方案就不合适了,我们完全可以先使用第二种方案过滤掉这些key。

针对这些key异常多,请求多,重复率比较低的数据,我们就没有必要进行缓存,使用第二种方案直接过滤掉。

而对于空数据的key有限的,重复率比较高的,我们则可以采用第一种方式进行缓存。

3.缓存击穿

======

3.1什么是缓存击穿

==========

缓存击穿是我们使用缓存可能遇到的第二个问题。

在平时高并发的系统中,大量的请求同时查询一个key时,此时这个key正好失效了,就会导致大量的请求都打到数据库上面去,这种现象我们称为缓存击穿。

3.2会带来什么问题

==========

会造成某一时刻数据请求量过大,压力剧增。

3.3如何解决

=======

上面现象是多个线程同时去查询数据库的这一条数据,那么我们可以在第一个查询数据的请求上使用一个互斥锁来锁住它。(如果是单机,可以用synchronized或者lock来处理,如果是分布式环境可以用分布式锁就可以了(分布式锁,可以用memcache的add, redis的setnx, zookeeper的添加节点操作))

其他线程走到这一步拿不到锁就等着,等待第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有了缓存,就直接走缓存。

4.缓存雪崩

======

4.1什么是缓存雪崩

==========

缓存雪崩的情况是指:当某一时刻发生大规模的缓存失效的情况,比如你的缓存服务宕机了,会有大量的请求进来直接打到数据库上面,结果就是数据库挂掉。

面试官:谈关于缓存穿透+击穿+雪崩,热点数据失效问题的解决方案

4.2解决办法

=======

4.2.1雪崩前:使用集群缓存,保证缓存服务的高可用

==========================

这种方案就是在发生雪崩前对缓存集群,实现高可用,如果是使用Redis,可以使用(主从 + 哨兵),Redis Cluster来避免Redis全盘崩溃的情况。

4.2.2雪崩中:ehcache本地缓存 + Hystrix限流 & 降级,避免MySQl被打死

================================================

使用ehcache本地缓存的目的也是考虑Redis Cluster完全不可用的时候,ehcache本地缓存还能够支撑一阵。

使用Hystrix进行限流 & 降级,比如一秒来了5000个请求,我们可以设置假设一秒只能有2000个请求可以通过这个组件,那么其他剩余的3000请求就会走限流逻辑。

然后去调用我们自己开发的降级组件(降级),比如设置的一些默认值等等之类的。以此来保护最后的MySQl不会被大量的请求打死。

一线互联网大厂Java核心面试题库

image

正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值