摘要

Apache Kafka是一个分布式消息发布订阅系统。它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),之后成为Apache项目的一部分。

成千上万的企业都在使用Kafka,三分之一的世界500强公司也在其中,Kafka也是成长最快的开源项目之一,包括其生态系统也在蓬勃发展。Kafka正在成为管理和处理流式数据的利器。

Kafka系统快速、可扩展并且可持久化。它的分区特性,可复制和可容错都是其不错的特性。大家一起来跟着阿里专家学习Kafka吧。

缓存雪崩

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

总结

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

**另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **

下面有部分截图希望能对大家有所帮助。


一些面试,大家都会有这些感触。

**另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **

下面有部分截图希望能对大家有所帮助。

[外链图片转存中…(img-3gclTwyX-1650424832200)]

Java篇,小米java校招面试相关推荐

  1. Java后端开发-大厂校招面试真题汇总【语雀图灵周瑜CSDN】

    BLOG内相关链接 & 积累常用对比等 Java实现快速排序算法 - yub4by - 博客园 (cnblogs.com) 三大类设计模式.Spring中用到的设计模式 - yub4by - ...

  2. 小米2017校招面试经历

    早上九点来到广州市珠江新岸酒店进行小米的面试,下面是面试官的一些问题,虽然已经阵亡,但是还要补充自己的不足!!!!经过这次面试,个人深刻体会到,所谓的 基础就是强悍的编程能力(涉及到问题的分析和解决能 ...

  3. 【java篇】Java到底是值传递还是引用传递?

    目录 1.基本数据类型的参数传递 2.引用数据类型的参数传递 3.原理 文章目的:验证Java语言到底是值传递还是引用传递以及Java参数传递的实现原理. 问题引入: 先阅读代码段: public s ...

  4. 【第四篇:解决校招面试中的测试设计题目】

    又到周六了,大家周末快乐! 如果你坚持看到了这边,那么接下来我们就可以聊聊软件测试工作中的基本功了.在应聘测试工程师或者测试开发工程师的过程中,测试设计题目的考察是必不可少的环节,本章会从常见的软件测 ...

  5. 未来学习规划 - java篇

    未来学习规划 - java篇 1. Java 1.1 JDK源码 1.1.1 HashMap HashMap的数据结构(1.7.1.8的区别) HashMap的实现原理 HashMap扩容为什么是2^ ...

  6. Big-man的Java篇(一)

    Big-man的Java篇(一) Java与Big-man的故事: Java是Sun(Stanford Universiy Network)公司开发出来的一套编程语言,主设计者是James Gosli ...

  7. 6轮字节前端校招面试经验分享

    大家好,我是若川.最近金三银四,今天分享一篇字节前端校招面试经验的轻松好文,相信看完会有所收获.也欢迎点击下方卡片关注或者星标我的公众号若川视野 因为我错过了2020年的秋招(ps: 那时候连数据结构 ...

  8. 一次幸运的校招小米Java后台offer(1),Java面试2021

    == 我是一个非985/211的本科.其实最开始并不怎么自信,靠的就是一帮基友互相的鼓励,才坚持到了现在. 我小米的面试机会是亲戚给内推的,因为碰巧他们部门校招没有招满,所以很幸运的拿到了这个机会. ...

  9. Android校招面试 —— Java篇

    一.Java 基础 1. Java 集合 集合的接口和具体实现类,介绍 List.Set 和 Map 的区别 ArrayList 与 LinkedList 区别,ArrayList.LinkedLis ...

  10. 校招小米Java后台

    [每日一语]只要活着,就不算悲剧.我们尚在途中,今后仍要继续.--<火花> 声明 首先声明,我是被逼着发文的...平时没有这种公开发文章的习惯,都是自己在印象上写自己的笔记.然而... 今 ...

最新文章

  1. ML之xgboost :xgboost.plot_importance()函数的解读
  2. 文件权限及chmod使用方法
  3. bzoj1597[Usaco2008 Mar]土地购买
  4. Zookeeper 安装和配置---学习三
  5. First C program
  6. 多路径配置udev_多路径multipath配置,udev绑定
  7. 这4个小程序为什么有很多人在用,仅仅是因为不占手机内存空间?
  8. 解决Eclipse无法添加Tomcat服务器的问题
  9. Gitlab利用Webhook实现Push代码后的Jenkins自动构建
  10. 2021-07-15-2021年全球10大最佳单板计算机开发板(SBC)(第1-3名)
  11. 2370 小机房的树
  12. MATLAB2018B下用Faster-RCNN做目标检测的训练和测试步骤
  13. 云讯健身管理系统-9
  14. 超好用的图标搜索网站
  15. 每天定时采集(当前时间到月底)携程机票数据
  16. 双臂电桥测低电阻大物实验数据处理(C++实现)
  17. 【已解决】部分安卓手机,部分ios机型,调微信的jssdk方法失败
  18. 有利可图网_有利可图的项目手册-现在可用
  19. NOI2018网络同步赛游记
  20. 【CentOS7联网】保姆级手把手解决CentOS7的上网问题

热门文章

  1. Linux内核和用户空间通信的方法
  2. 【技术栈——00061】搭建关于python项目docker镜像的Dockerfile文件示例(自己的)
  3. 高中数学40分怎么办_高二了数学40多分还有救吗?
  4. 编写一个简单Java程序,计算银行年存款的本息
  5. 工薪族巧理财之定期存款中整存整取、零存整取、存本取息之间的微妙区别
  6. Ubuntu 18.04 LTS 安装JDK1.8-Linux-64
  7. python简易爬虫
  8. WDN302国产化网络存储控制模块
  9. php 如何将富文本内容输出到word里面且添加页眉和页脚
  10. luajit的字节码