做司考题的网站dw免费网站模板下载
news/
2025/10/3 10:36:13/
文章来源:
做司考题的网站,dw免费网站模板下载,每平每家设计家官网,找人做销售网站作者#xff1a;乔二爷#xff0c;来自#xff1a;乔二爷#xff08;ID#xff1a;hellozhouq#xff09;1 前言昨天晚上接到阿里的电面电话#xff0c;过程中就问到了关于缓存相关的问题。虽然以前接触过#xff0c;多多少少了解了一些。但是之前自己并没有好好记录这… 作者乔二爷来自乔二爷IDhellozhouq1 前言昨天晚上接到阿里的电面电话过程中就问到了关于缓存相关的问题。虽然以前接触过多多少少了解了一些。但是之前自己并没有好好记录这些内容在真正面试的时候并没有回答得出来。今天记录一下长长记性。在我们的平常的项目中多多少少都会使用到缓存因为一些数据我们没有必要每次查询的时候都去查询到数据库。特别是高 QPS 的系统每次都去查询数据库对于你的数据库来说将是灾难。今天我们不牵涉多级缓存的知识就把系统使用到的缓存方案不管是一级还是多级的都统称为缓存主要是为了讲述使用缓存的时候可能会遇到的一些问题以及一些解决办法。我们使用缓存时我们的业务系统大概的调用流程如下图当我们查询一条数据时先去查询缓存如果缓存有就直接返回如果没有就去查询数据库然后返回。这种情况下就可能会出现一些现象。2 缓存穿透2.1 什么是缓存穿透正常情况下我们去查询数据都是存在。那么请求去查询一条压根数据库中根本就不存在的数据也就是缓存和数据库都查询不到这条数据但是请求每次都会打到数据库上面去。这种查询不存在数据的现象我们称为缓存穿透。2.2 穿透带来的问题试想一下如果有黑客会对你的系统进行攻击拿一个不存在的id 去查询数据会产生大量的请求到数据库去查询。可能会导致你的数据库由于压力过大而宕掉。2.3 解决办法2.3.1 缓存空值之所以会发生穿透就是因为缓存中没有存储这些空数据的key。从而导致每次查询都到数据库去了。那么我们就可以为这些key 设置的值设置为null 丢到缓存里面去。后面再出现查询这个key 的请求的时候直接返回null ,就不用在到 数据库中去走一圈了。但是别忘了设置过期时间。2.3.2 BloomFilterBloomFilter 类似于一个hase set 用来判断某个元素key是否存在于某个集合中。具体概念这种方式在大数据场景应用比较多比如 Hbase 中使用它去判断数据是否在磁盘上。还有在爬虫场景判断url 是否已经被爬取过。这种方案可以加在第一种方案中在缓存之前在加一层 BloomFilter 在查询的时候先去 BloomFilter 去查询 key 是否存在如果不存在就直接返回存在再走查 缓存 - 查 DB。流程图如下2.4 如何选择针对于一些恶意攻击攻击带过来的大量key 是不存在的那么我们采用第一种方案就会缓存大量不存在 key 的数据。此时我们采用第一种方案就不合适了我们完全可以先对使用第二种方案进行过滤掉这些key。针对这种key 异常多请求重复率比较低的数据我们就没有必要进行缓存使用第二种方案直接过滤掉。对于空数据的key 有限的重复率比较高的我们则可以采用第一种方式进行缓存。3 缓存击穿3.1 什么是击穿缓存击穿是我们可能遇到的第二个使用缓存方案可能遇到的问题。在平常高并发的系统中大量的请求同时查询一个 key 时此时 这个key 正好失效了就会导致大量的请求都打到数据库上面去。这种现象我们成为击穿。3.2 会带来什么问题会造成某一时刻数据库请求量过大压力剧增。3.3 如何解决上面的现象是多个线程同时去查询数据库的这条数据那么我们可以在第一个查询数据的请求上使用一个 互斥锁来锁住它。其他的线程走到这一步拿不到锁就等着等第一个线程查询到了数据然后做缓存。后面的线程进来发现已经有缓存了就直接走缓存。4、缓存雪崩4.1 什么是缓存雪崩缓存的情况是说当某一时刻发生大规模的缓存失效的情况。比如你的缓存服务宕机了会有大量的请求进来直接打到DB上面。结果就是DB 称不住挂掉。4.2 解决办法4.2.1 事前使用集群缓存保证缓存服务的高可用这种方案就是在发生雪崩前对缓存集群实现高可用如果是使用 Redis可以使用 主从哨兵 Redis Cluster 来避免 Redis 全盘崩溃的情况。4.2.2 事中使用 ehcache 本地缓存 Hystrix 限流降级 ,避免 MySQL 被打死的情况发生。使用 ehcache 本地缓存的目的也是考虑在 Redis Cluster 完全不可用的时候ehcache 本地缓存还能够支撑一阵。使用 Hystrix 进行 限流 降级 比如一秒来了5000个请求我们可以设置假设只能有一秒 2000 个请求能通过这个组件那么其他剩余的 3000 请求就会走限流逻辑然后去调用我们自己开发的降级组件降级。比如设置的一些默认值呀之类的。以此来保护最后的 MySQL 不会被大量的请求给打死。4.2.3 事后开启 Redis 持久化机制尽快恢复缓存集群一旦重启就能从磁盘上自动加载数据恢复内存中的数据。防止雪崩方案如下图所示5 热点数据集中失效问题怎么解决我们在设置缓存的时候一般会给缓存设置一个失效时间过了这个时间缓存就失效了。对于一些热点的数据来说当缓存失效以后会存在大量的请求过来然后打到数据库去从而可能导致数据库崩溃的情况。5.1 解决办法5.1.1 设置不同的失效时间为了避免这些热点的数据集中失效那么我们在设置缓存过期时间的时候我们让他们失效的时间错开。比如在一个基础的时间上加上或者减去一个范围内的随机值。5.1.2 互斥锁结合上面的击穿的情况在第一个请求去查询数据库的时候对他加一个互斥锁其余的查询请求都会被阻塞住直到锁被释放从而保护数据库。但是也是由于它会阻塞其他的线程此时系统吞吐量会下降。需要结合实际的业务去考虑是否要这么做。【End】老王给大家准备一份「Java最常见200面试题全解析」助力大家找到更好的工作这份面试题包含的模块Java、JVM 最常见面试题解析Spring、Spring MVC、MyBatis、Hibernate 面试题解析MySQL、Redis 面试题解析RabbitMQ、Kafka、Zookeeper 面试解析微服务 Spring Boot、Spring Cloud 面试解析扫描下面二维码付费阅读关注下方二维码订阅更多精彩内容。转发朋友圈是对我最大的支持。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925780.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!