Java详解:java基础案例教程第⼆版pdf
缓存雪崩
缓存雪崩指的是Redis当中的⼤量缓存在同⼀时间全部失效,⽽假如恰巧这⼀段时间同时⼜有⼤量请求被发起,那么就会造成请求直接访问到数据库,可能会把数据库冲垮。
缓存雪崩⼀般形容的是缓存中没有⽽数据库中有的数据,⽽因为时间到期导致请求直达数据库。
解决⽅案
解决缓存雪崩的⽅法有很多:
1、加锁,保证单线程访问缓存。这样就不会有很多请求同时访问到数据库。
2、失效时间不要设置成⼀样。典型的就是初始化预热数据的时候,将数据存⼊缓存时可以采⽤随机时间来确保不会咋同⼀时间有⼤量
缓存失效。
3、内存允许的情况下,可以将缓存设置为永不失效。
缓存击穿
缓存击穿和缓存雪崩很类似,区别就是缓存击穿⼀般指的是单个缓存失效,⽽同⼀时间⼜有很⼤的并发请求需要访问这个key,从⽽造成了数据库的压⼒。
解决⽅案
解决缓存击穿的⽅法和解决缓存雪崩的⽅法很类似:
1、加锁,保证单线程访问缓存。这样第⼀个请求到达数据库后就会重新写⼊缓存,后续的请求就可以直接读取缓存。
2、内存允许的情况下,可以将缓存设置为永不失效。
缓存穿透
缓存穿透和上⾯两种现象的本质区别就是这时候访问的数据其在数据库中也不存在,那么既然数据库不存在,所以缓存⾥⾯肯定也不会存在,这样如果并发过⼤就会造成数据源源不断的到达数据库,给数据库造成极⼤压⼒。
解决⽅案
对于缓存穿透问题,加锁并不能起到很好地效果,因为本⾝key就是不存在,所以即使控制了线程的访问数,但是请求还是会源源不断的到达数据库。
解决缓存穿透问题⼀般可以采⽤以下⽅案配合使⽤:
1、接⼝层进⾏校验,发现⾮法的key直接返回。⽐如数据库中采⽤的是⾃增id,那么如果来了⼀个⾮整型的id或者负数id可以直接返
回,或者说如果采⽤的是32位uuid,那么发现id长度不等于32位也可以直接返回。
2、将不存在的数据也进⾏缓存,可以直接缓存⼀个空或者其他约定好的⽆效value。采⽤这种⽅案最好将key设置⼀个短期失效时间,
否则⼤量不存在的key被存储到Redis中,也会占⽤⼤量内存。
布隆过滤器(Bloom Filter)
针对上⾯缓存穿透的解决⽅案,我们思考⼀下:假如⼀个key可以绕过第1种⽅法的校验,⽽此时有⼤量的不存在key被访问(如1亿个或者10亿个),那么这时候全部存储到缓存,会占⽤⾮常⼤的空间,会浪费⼤量服务器内存,导致内存不⾜。
那么有没有⼀种更好的解决⽅案呢?这就是我们接下来要介绍的布隆过滤器,布隆过滤器就可以最⼤程度的解决key值过多的这个问题。
什么是布隆过滤器
可能⼤部分⼈都知道有这么⼀个⾯试问题:如何在10亿的海量的⽆序的数据中快速判断⼀个元素是否存在?
要解决这个问题就需要⽤到布隆过滤器,否则⼤部分服务器的内存是⽆法存储这么⼤的数量级的数据的。
布隆过滤器(Bloom Filter)是由布隆在1970年提出的。它实际上是⼀个很长的⼆进制向量(位图)和⼀系列随机映射函数(哈希函数)。
布隆过滤器可以⽤于检索⼀个元素是否在⼀个集合中。它的优点是空间效率和查询时间都⽐⼀般的算法要好的多,缺点是有⼀定的误识别率⽽且删除困难。
位图(Bitmap)
Redis当中有⼀种数据结构就是位图,布隆过滤器其中重要的实现就是位图的实现,也就是位数组,并
且在这个数组中每⼀个位置只有0和1两种状态,每个位置只占⽤1个字节,其中0表⽰没有元素存在,1表⽰有元素存在。如下图所⽰就是⼀个简单的布隆过滤器⽰例(⼀个key 值经过哈希运算和位运算就可以得出应该落在哪个位置):
哈希碰撞
上⾯我们发现,lonely和wolf落在了同⼀个位置,这种不同的key值经过哈希运算后得到相同值的现象就称之为哈希碰撞。发⽣哈希碰撞之后再经过位运算,那么最后肯定会落在同⼀个位置。
如果发⽣过多的哈希碰撞,就会影响到判断的准确性,所以为了减少哈希碰撞,我们⼀般会综合考虑以下2个因素:
1、增⼤位图数组的⼤⼩(位图数组越⼤,占⽤的内存越⼤)。
2、增加哈希函数的次数(同⼀个key值经过1个函数相等了,那么经过2个或者更多个哈希函数的计算,都得到相等结果的概率就⾃然
会降低了)。
上⾯两个⽅法我们需要综合考虑:⽐如增⼤位数组,那么就需要消耗更多的空间,⽽经过越多的哈希计算也会消耗cpu影响到最终的计算时间,所以位数组到底多⼤,哈希函数次数⼜到底需要计算多少次合适需要具体情况具体分析。
布隆过滤器的2⼤特点
下⾯这个就是⼀个经过了2次哈希函数得到的布隆过滤器,根据下图我们很容易看到,假如我们的Redis根本不存在,但是Redis经过2次哈希函数之后得到的两个位置已经是1了(⼀个是wolf通过f2得到,⼀个是Nosql通过f1得到)。
所以通过上⾯的现象,我们从布隆过滤器的⾓度可以得出布隆过滤器主要有2⼤特点:
1、如果布隆过滤器判断⼀个元素存在,那么这个元素可能存在。
2、如果布隆过滤器判断⼀个元素不存在,那么这个元素⼀定不存在。
⽽从元素的⾓度也可以得出2⼤特点:
1、如果元素实际存在,那么布隆过滤器⼀定会判断存在。
2、如果元素不存在,那么布隆过滤器可能会判断存在。
PS:需要注意的是,如果经过N次哈希函数,则需要得到的N个位置都是1才能判定存在,只要有⼀个是0,就可以判定为元素不存在布隆过滤器中。
fpp
因为布隆过滤器中总是会存在误判率,因为哈希碰撞是不可能百分百避免的。布隆过滤器对这种误判率称之为假阳性概率,即:False Positive Probability,简称为fpp。
在实践中使⽤布隆过滤器时可以⾃⼰定义⼀个fpp,然后就可以根据布隆过滤器的理论计算出需要多少
个哈希函数和多⼤的位数组空间。需要注意的是这个fpp不能定义为100%,因为⽆法百分保证不发⽣哈希碰撞。
总结
⾯试难免让⼈焦虑不安。经历过的⼈都懂的。但是如果你提前预测⾯试官要问你的问题并想出得体的回答⽅式,就会容易很多。
此外,都说“⾯试造⽕箭,⼯作拧螺丝”,那对于准备⾯试的朋友,你只需懂⼀个字:刷!
给我刷刷刷刷,使劲⼉刷刷刷刷刷!今天既是来谈⾯试的,那就必须得来整点⾯试真题,这不花了我整28天,做了份“Java⼀线⼤⼚⾼岗⾯试题解析合集:JAVA基础-中级-⾼级⾯试+SSM框架+分布式+性能调优+微服务+并发编程+⽹络+设计模式+数据结构与算法等”
且除了单纯的刷题,也得需准备⼀本【JAVA进阶核⼼知识⼿册】:JVM、JAVA集合、JAVA多线程并发、JAVA基础、Spring 原理、微服务、Netty与RPC、⽹络、⽇志、Zookeeper、Kafka、RabbitMQ
、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、⼀致性算法、JAVA算法、数据结构、加密算法、分布式缓存、Hadoop、Spark、Storm、YARN、机器学习、云计算,⽤来查漏补缺最好不过。
java基础教程第三版pdfabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、⼀致性算法、JAVA算法、数据结构、加密算法、分布式缓存、Hadoop、Spark、Storm、YARN、机器学习、云计算,⽤来查漏补缺最好不过。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论