缓存雪崩

缓存雪崩指的是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%,因为无法百分保证不发生哈希碰撞。

总结:心得体会

既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。

学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。

面试大厂,最基本的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。

最后,上面这些大厂面试真题都是非常好的学习资料,通过这些面试真题能够看看自己对技术知识掌握的大概情况,从而能够给自己定一个学习方向。包括上面分享到的学习指南,你都可以从学习指南里理顺学习路线,避免低效学习。

领取上述资料,只需点击这里即可免费下载

大厂Java架构核心笔记(适合中高级程序员阅读):

学习路线,避免低效学习。

领取上述资料,只需点击这里即可免费下载

大厂Java架构核心笔记(适合中高级程序员阅读):

看这里!java兼职一天多少钱相关推荐

  1. python 兼职多少钱一小时_无印良品兼职一小时多少钱?看完后就清楚了!

    现在像一些比较大的城市商业区都会有无印良品的店面,无印良品作为一家日本品牌,拥有了一些大学生粉丝,不少大学生想通过寒暑假的时间在无印良品找兼职工作.那么,无印良品兼职一小时多少钱?下面就让希财君为大家 ...

  2. 你需要偷偷珍藏的java兼职平台

    兼职在现在来说,应该不算什么非常罕见的事情.如果你感觉java技术还可以再练练手,或者想在闲暇的时间赚一点外快.那下面这些Java兼职平台,你一定要收藏. 1,程序员客栈 老实说,当时我使用这个平台, ...

  3. 学java培训开发需要多少钱

    学java培训开发需要多少钱?这个问题对于想要学习java技术的小伙伴们来说是非常重要的,如今市面上的java培训机构非常多,收费标准都是多少呢?那么来看看下面的详细介绍吧. 学java培训开发需要多 ...

  4. java重要基础知识点_必看 | 新人必看的Java基础知识点大梳理

    原标题:必看 | 新人必看的Java基础知识点大梳理 各位正在认真苦学Java的准大神,在这烈日炎炎的夏季里,老九君准备给大家带来一个超级大的"冰镇西瓜,"给大家清凉一下,压压惊. ...

  5. 【读书笔记】《写给大忙人看的Java SE 8》——Java8新特性总结

    2019独角兽企业重金招聘Python工程师标准>>> 阅读目录 接口中的默认方法和静态方法 函数式接口和Lambda表达式 Stream API 新的日期和时间 API 杂项改进 ...

  6. 面试必看:java面试考点精讲视频教程

    面试必看:java面试考点精讲视频教程 Java作为目前比较火的计算机语言之一,连续几年蝉联最受程序员欢迎的计算机语言榜首,因此每年新入职Java程序员也数不胜数.很多java程序员在学成之后,会面临 ...

  7. 看我是如何严辞拒绝同学借钱的

    看我是如何严辞拒绝同学借钱的      朋友同学之间借钱应急一下本无可非议,但现在许多经验和历史教训告诉我们,借钱给他人就等于失去这个朋友,最后弄得自己也很郁闷甚至是恼怒,所以在这里转一篇关于如何拒绝 ...

  8. java开发人员工资多少钱_全世界有多少Java开发人员?

    java开发人员工资多少钱 Oracle说 是9,000,000 . 维基百科声称 是10,000,000 . 来自NumberOf.net的人员似乎是最精确的–他们知道那里确实有9,007,346 ...

  9. java byte char io流_一文带你看懂JAVA IO流,史上最全面的IO教学

    原标题:一文带你看懂JAVA IO流,史上最全面的IO教学 一.IO流是什么 惯例引用百科的回答 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符 ...

最新文章

  1. Ubuntu14.04下配置OpenGL及测试代码
  2. 前端开发之retina屏幕
  3. 问题解决笔记,Restarting network (via systemctl):: Job for network.service failed. ...
  4. 万物互联时代 能效管理是怎样一个玩法?
  5. ChannelFactory.Endpoint 上的地址属性为空。ChannelFactory 的终结点必须指定一个有效的地址。...
  6. 内部类访问局部变量的时候,为什么变量必须加上final修饰
  7. 关于vc++调用 exe文件的问题
  8. Jenkins远程调度Shell命令
  9. 数据--第42课 - 图的遍历
  10. pdf数据结构题集c语言版,数据结构题集答案(c语言版)(严蔚敏-吴伟民著).pdf
  11. 带圈数字符号0-100和unicode编码
  12. starway(NOIP模拟测试24)
  13. 论文查重 降重复度?如何进行毕业论文查重--总结贴
  14. win10专业版虚拟机配置服务器,win10专业版怎么运行虚拟机_win10专业版开启虚拟机的方法...
  15. Coremail-0day敏感文件泄露漏洞送附批量检测脚本
  16. 3w最简单led灯电路图_怎么选择自己合适的LED驱动IC?(十大LED驱动IC典型应用电路图)...
  17. TensorRT INT8量化原理与实现(非常详细)
  18. golang中slice切片使用的误区
  19. 无法识别的USB设备:跟这台计算机连接的一个USB设备运行不正常,WINDOWS无法识别...
  20. RT-Thread实战笔记|MPU6050使用详解及DMP姿态解算

热门文章

  1. Python网络爬虫之爬取微博热搜
  2. 一个屌丝程序员的青春(一三八)
  3. OpenFace人脸分类器训练
  4. Word技巧之:将PPT框图以可编辑形式插入Word文档
  5. 汪涵曾因太穷被前妻离婚,杨乐乐因一个动作就把初恋男友甩了
  6. 航测无人机las点云数据生成DEM
  7. 绝对定位元素的margin如何设置
  8. 微信小程序 Unexpected token in JSON at position 0 设置二维码,并且使用js中JSON.parse()函数将二维码返回的值转化为json格式
  9. 微信公众号模板消息推送(附上完整代码)
  10. Dubbo是什么?能做什么?架构图?