花了20天的时间给粉丝整理的一套“最全“的Java求职笔记(八)

大家好,我是小编LRyab,公众号LRyab博客网,LRyab博客网是分享一些个人成长、思考方向、个人感悟、职业规划,博客涵盖java技术 vue. html. css.前端技术spring全家桶. linux运维技术在365天把你打造出来一个全栈工程师!
点击下方卡片关注公众号,每天分享一篇技术干货!

前言:前几天有粉丝问我,网上java面试题总是参差不齐,希望我为他整理一套全面的java面试题,并且这套java面试题有个要求,必须能够让他20天就能看完这些面试题,他说现在很多面试题我看都得看3个月才能看完,然后我才能去找工作,但是自己得时间有限所以想让我帮他总结一套万能面试java求职笔记。接下来我将会至少分为12个章节进行阐述这套Java求职笔记,感兴趣的可以坚持看完!觉得不错的可以点个赞。

1为什么写这套Java求职笔记

很早的时候我就想写一些Java求职方向的一些文章,由于很长时间耽搁了加上,有粉丝后台问我,可不可以帮他总结一些java求职笔记,他看了很多Java技术有很多技术,很迷茫不知道学哪些,我笑着说,不要着急,无论你到什么时候你都会迷茫,因为技术一直在更新,谢谢你信任我,解救你的迷茫唯一办法就是多看LRyab博客,就是这样我带着粉丝的问题,开始编写了这套Java求职笔记,看完这套求职笔记,我相信很多人都会找到属于自己的心仪工作。

2Redis&RabbitMq技术知识大纲

3一文彻底搞懂Redis RabbitMQ常见面试问题

3.1Redis常见面试题

1、什么是Redis?

Redis 是完全开源免费的, 遵守 BSD 协议, 是一个高性能的 key-value 数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:

Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

Redis 不仅仅支持简单的 key-value 类型的数据, 同时还提供 list, set, zset, hash 等数据结构的存储。

Redis 支持数据的备份, 即 master-slave 模式的数据备份。

2、Redis 的数据类型?

Redis 支持五种数据类型:string( 字符串),hash( 哈希), list( 列表), set(集合) 及 zsetsorted set:有序集合)。

我们实际项目中比较常用的是 string,hash 如果你是 Redis 中高级用户,还需要加上下面几种数据结构 HyperLogLog、Geo、Pub/Sub。

如果你说还玩过 Redis Module,像 BloomFilter,RedisSearch,Redis-ML,面试官的眼睛就开始发亮了。

3、使用Redis 有哪些好处?

3.1速度快, 因为数据存在内存中, 类似于 HashMap, HashMap 的优势就是查找和操作的时间复杂度都是 O1)

3.2支持丰富数据类型, 支持 string, list, set, Zset, hash 等

3.3支持事务, 操作都是原子性, 所谓的原子性就是对数据的更改要么全部执行, 要么全部不执行

3.4丰富的特性:可用于缓存,消息,按 key 设置过期时间,过期后将会自动删

4、Redis 是单进程单线程的?

Redis 是单进程单线程的, redis 利用队列技术将并发访问变为串行访问, 消除了传统数据库串行控制的开销。

5、一个字符串类型的值能存储最大容量是多少?

答:512M

6、Redis 的持久化机制是什么?各自的优缺点?

Redis 提供两种持久化机制 RDB 和 AOF 机制:

1、RDBRedis DataBase)持久化方式:是指用数据集快照的方式半持久化模式) 记录 redis 数据库的所有键值对,在某个时间点将数据写入一个临时文件, 持久化结束后, 用这个临时文件替换上次持久化的文件, 达到数据恢复。

优点:

1、只有一个文件 dump.rdb, 方便持久化。

2、容灾性好, 一个文件可以保存到安全的磁盘。

3、性能最大化, fork 子进程来完成写操作, 让主进程继续处理命令, 所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能) 4.相对于数据集大时, 比 AOF 的启动效率更高。

缺点:

1、数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障, 会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)

2、AOFAppend-only file)持久化方式:是指所有的命令行记录以 redis 命令请求协议的格式完全持久化存储)保存为 aof 文件。

优点:

1、数据安全, aof 持久化可以配置 appendfsync 属性, 有 always, 每进行一次命令操作就记录到 aof 文件中一次。

2、通过 append 模式写文件, 即使中途服务器宕机, 可以通过 redis-check-aof 工具解决数据一致性问题。

3、AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前( 文件过大时会对命令进行合并重写), 可以删除其中的某些命令( 比如误操作的 flushall))

缺点:

1、AOF 文件比 RDB 文件大, 且恢复速度慢。

2、数据集大着的时候, 比 rdb 启动效率低。

7、为什么 Redis 需要把所有数据放到内存中?

Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以 redis 具有快速和数据持久化的特征。如果不将数据放在内存中,

磁盘 I/O 速度为严重影响 redis 的性能。在内存越来越便宜的今天, redis 将会越来越受欢迎。如果设置了最大使用的内存, 则数据已有记录数达到内存限值后不能继续插入新值。

8、Redis 的同步机制了解么?

Redis 可以使用主从同步,从从同步。第一次同步时,主节点做一次 bgsave, 并同时将后续修改操作记录到内存 buffer, 待完成后将 rdb 文件全量同步到复制节点,

复制节点接受完成后将 rdb 镜像加载到内存。加载完成后, 再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。

9、是否使用过 Redis 集群,集群的原理是什么?

Redis Sentinal 着眼于高可用, 在 master 宕机时会自动将 slave 提升为master, 继续提供服务。

Redis Cluster 着眼于扩展性, 在单个 redis 内存不足时, 使用 Cluster 进行分片存储。

10、Redis 支持的Java 客户端都有哪些?官方推荐用哪个?

Redisson、Jedis、lettuce 等等, 官方推荐使用 Redisson。

11、Jedis 与 Redisson 对比有什么优缺点?

Jedis 是 Redis 的 Java 实现的客户端, 其 API 提供了比较全面的 Redis 命令的支持;Redisson 实现了分布式和可扩展的 Java 数据结构,和 Jedis 相比,功能较为简单, 不支持字符串操作, 不支持排序、事务、管道、分区等 Redis 特性。Redisson 的宗旨是促进使用者对 Redis 的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上

12、怎么理解 Redis 事务?

1) 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中, 不会被其他客户端发送来的命令请求所打断。

2) 事务是一个原子操作:事务中的命令要么全部被执行, 要么全部都不执行。

13、Redis 事务相关的命令有哪几个?

MULTI、EXEC、DISCARD、WATCH

14、缓存穿透、缓存击穿、缓存雪崩解决方案

缓存穿透

指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。

解决方案:

查询返回的数据为空,仍把这个空结果进行缓存,但过期时间会比较短

布隆过滤器:将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对 DB 的查询。

缓存击穿

对于设置了过期时间的 key,缓存在某个时间点过期的时候,恰好这时间点对这个 Key 有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。

解决方案:

使用互斥锁:当缓存失效时,不立即去 load db,先使用如 Redis 的 setnx 去设置一个互斥锁,当操作成功返回时再进行 load db 的操作并回设缓存,否则重试 get 缓存的方法。

永远不过期:物理不过期,但逻辑过期(后台异步线程去刷新)。

缓存雪崩

设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到 DB, DB 瞬时压力过重雪崩。与缓存击穿的区别:雪崩是很多 key,击穿是某一个key 缓存。

解决方案:

将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如 1-5 分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

15、 Redis 的集群模式

(1)主从复制

当从数据库启动时,会向主数据库发送sync命令,主数据库接收到sync后开始在后台保存快照rdb,在保存快照期间收到的命令缓存起来,当快照完成时,主数据库会将快照和缓存的命令一块发送给从**。复制初始化结束。之后,主每收到1个命令就同步发送给从。当出现断开重连后,2.8之后的版本会将断线期间的命令传给重数据库。增量复制

主从复制是乐观复制,当客户端发送写执行给主,主执行完立即将结果返回客户端,并异步的把命令发送给从,从而不影响性能。也可以设置至少同步给多少个从主才可写。无硬盘复制:如果硬盘效率低将会影响复制性能,2.8之后可以设置无硬盘复制,repl-diskless-sync yes

(2)哨兵模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hzcc1bJo-1613794914158)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/3e8c3ce5-a43d-45f0-a384-90ecc42dbaff/Untitled.png)]

哨兵的作用:

1、监控redis主、从数据库是否正常运行

2、主出现故障自动将从数据库转换为主数据库。

哨兵的核心知识

1、哨兵至少需要 3 个实例,来保证自己的健壮性。

2、哨兵 + redis 主从的部署架构,是不保证数据零丢失的,只能保证 redis 集群的高可用性。

3、对于哨兵 + redis 主从这种复杂的部署架构,尽量在测试环境和生产环境,都进行充足的测试和演练。

4、配置哨兵监控一个系统时,只需要配置其监控主数据库即可,哨兵会自动发现所有复制该主数据库的从数据库。

16、内存淘汰机制

redis 内存淘汰机制有以下几个:

noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。

allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。

allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。

volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。

volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。

volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。

17、Redis 和 Mysql 的数据不一致怎么办

定时任务更新

通过定时任务,按照一定时间间隔更新缓存。

优点:不影响正常业务,在特殊场景应用广泛。

缺点:不保证实时一致性,且需要为每个任务写一个调度代码。

适用环境:适用于需要复杂数据统计的缓存更新,比如展示高速车流量,五分钟一次的统计不会影响业务使用。

18、为什么Redis要使用缓存?

Redis使用缓存是为了实现高性能和高并发。

Redis操作缓存就是直接操作内存,速度相当快,用户下一次再访问这些数据时可以直接从缓存中获取,以达到高性能的目的。

缓存能够承受的请求数量是远远大于直接访问数据库的,数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存而不用经过数据库,以达到高并发的目的。

19、谈谈你对Redis的理解?

Redis是一种基于键值对的内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。

提供了多种功能应用

数据缓存功能,减少对数据库的访问压力,比如优化网站性能和一些不经常变动的数据

消息队列功能: Redis提供了发布订阅功能和阻塞队列功能

计数器-应用保存用户凭证比如计算浏览数,如果每次操作都要做数据库的对应更新操作,那将会给数据库的性能带来极大的挑战

redis的应用场景场景有:

缓存数据服务器比如SSO单点登录

应对高速读写的场景比如秒杀高可用

分布式锁比如秒杀数据一致性

数据共享比如库存数据

20、Redis为什么不适应多线程?

单线程编程容易并且更容易维护;

Redis的性能瓶颈不在CPU上,主要在内存和网络;

多线程就会存在死锁、线程上下文切换等问题,甚至会影响性能。

Redis在6.0之后引入了多线程

21、Redis回收进程如何工作的?

一个客户端运行了新的命令,添加了新的数据。

Redis检查内存使用情况,如果大于最大内存的限制, 则根据设定好的策略进行回收。

一个新的命令被执行,不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。

如果一个命令的结果导致大量内存被使用,不用多久内存限制就会被这个内存使用量超越。

22、Redis集群会有写操作丢失吗?为什么?

Redis 并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。

23、Redis的内存用完了会发生什么?

如果达到设置的上限,Redis的写命令会返回错误信息,但是读命令还可以正常返回。可以将Redis当缓存来使用配置淘汰机制,当内存达到上限时会冲刷掉旧的内容。

24、Redis有哪些应用场景?

最简单的就是缓存、用户登陆和校验码

Redis提供的有序集合数据能构造排行榜功能,比如文章访问排行榜,月度销售排行榜等。

Redis提供的incr命令可以用来实现计数器功能,比如视频的播放量,文章的浏览量等。

Redis提供的发布/订阅和阻塞队列功能可以实现一个简单的聊天室。

3.2RabbitMQ常见面试题

1、什么是rabbitmq?

采用AMQP高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦。

2、为什么要使用rabbitmq?

(1)在分布式系统下具备异步,削峰,负载均衡等一系列高级功能;

(2)拥有持久化的机制,进程消息,队列中的信息也可以保存下来。

(3)实现消费者和生产者之间的解耦。

(4)对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定量的限流,利于数据库的操作。

(5)可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单。

3、使用rabbitmq的场景。

服务间异步通信、顺序消费、定时任务、请求削峰

4、使用RabbitMQ有什么好处?

(1)服务间高度解耦

(2)异步通信性能高

(3)流量削峰

5、mq的缺点

系统可用性降低

系统引入的外部依赖越多,越容易挂掉,本来你就是A系统调用BCD三个系统的接口就好了,人 ABCD四个系统好好的,没啥问题,你偏加个MQ进来,万一MQ挂了咋整?MQ挂了,整套系统崩溃了,你不就完了么。

系统复杂性提高硬生生加个MQ进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?头大头大,问题一大堆,痛苦不已。

一致性问题

A系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是BCD三个系统那里,BD两个系统写库成功了,结果C系统写库失败了,咋整?你这数据就不一致了。

所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉,最好之后,你会发现,妈呀,系统复杂度提升了一个数量级,也许是复杂了10倍。但是关键时刻,用,还是得用的。

6、MQ的优点。

异步处理 - 相比于传统的串行、并行方式,提高了系统吞吐量。

应用解耦 - 系统间通过消息通信,不用关心其他系统的处理。

流量削锋 - 可以通过消息队列长度控制请求量;可以缓解短时间内的高并发请求。

日志处理 - 解决大量日志传输。

消息通讯 - 消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等。

7、解耦、异步、削峰是什么?

解耦:A系统发送数据到BCD三个系统,通过接口调用发送。如果E系统也要这个数据呢?那如果C系统现在不需要了呢?A系统负责人几乎崩溃A 系统跟其它各种乱七八糟的系统严重耦合,A系统产生一条比较关键的数据,很多系统都需要A系统将这个数据发送过来。如果使用MQ,A系统产生一条数据,发送到MQ里面去,哪个系统需要数据自己去MQ里面消费。如果新系统需要数据,直接从MQ里消费即可;如果某个系统不需要这条数据了,就取消对MQ消息的消费即可。这样下来,A系统压根儿不需要去考虑要给谁发送数据,不需要维护这个代码,也不需要考虑人家是否调用成功、失败超时等情况。

就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其 实这个调用是不需要直接同步调用接口的,如果用MQ给它异步化解耦。

异步:A系统接收一个请求,需要在自己本地写库,还需要在BCD三个系统写库,自己本地写库要3ms,BCD三个系统分别写库要 300ms、450ms、200ms。最终请求总延时是3+300+450+200=953ms,接近1s,用户感觉搞个什么东西,慢死了慢死了。用户通过浏览器发起请求。

如果使用MQ,那么A系统连续发送3条消息到MQ队列中,假如耗时5ms,A系统从接受一个请求到返回响应给用户,总时长是3+5=8ms。

削峰:减少高峰时期对服务器压力。

8、你们公司生产环境用的是什么消息中间件?

这个首先你可以说下你们公司选用的是什么消息中间件,比如用的是RabbitMQ,然后可以初步给一些你对不同MQ中间件技术的选型分析。

举个例子:比如说ActiveMQ是老牌的消息中间件,国内很多公司过去运用的还是非常广泛的,功能很强大。

但是问题在于没法确认ActiveMQ可以支撑互联网公司的高并发、高负载以及高吞吐的复杂场景,在国内互联网公司落地较少。而且使用较多的是一些传统企业,用ActiveMQ做异步调用和系统解耦。

然后你可以说说RabbitMQ,他的好处在于可以支撑高并发、高吞吐、性能很高,同时有非常完善便捷的后台管理界面可以使用。

另外,他还支持集群化、高可用部署架构、消息高可靠支持,功能较为完善。

而且经过调研,国内各大互联网公司落地大规模RabbitMQ集群支撑自身业务的case较多,国内各种中小型互联网公司使用RabbitMQ的实践也比较多。

除此之外,RabbitMQ的开源社区很活跃,较高频率的迭代版本,来修复发现的bug以及进行各种优化,因此综合考虑过后,公司采取了RabbitMQ。

但是RabbitMQ也有一点缺陷,就是他自身是基于erlang语言开发的,所以导致较为难以分析里面的源码,也较难进行深层次的源码定制和改造,毕竟需要较为扎实的erlang语言功底才可以。

然后可以聊聊RocketMQ,是阿里开源的,经过阿里的生产环境的超高并发、高吞吐的考验,性能卓越,同时还支持分布式事务等特殊场景。

而且RocketMQ是基于Java语言开发的,适合深入阅读源码,有需要可以站在源码层面解决线上生产问题,包括源码的二次开发和改造。

另外就是Kafka。Kafka提供的消息中间件的功能明显较少一些,相对上述几款MQ中间件要少很多。

但是Kafka的优势在于专为超高吞吐量的实时日志采集、实时数据同步、实时数据计算等场景来设计。

因此Kafka在大数据领域中配合实时计算技术(比如Spark Streaming、Storm、Flink)使用的较多。但是在传统的MQ中间件使用场景中较少采用。

9、RabbitMQ的工作模式

simple模式(即最简单的收发模式)

work工作模式(资源的竞争)

publish/subscribe发布订阅(共享资源)

routing路由模式

10、RabbitMQ集群架构模式

主备模式

远程模式

镜像模式

多活模式

4个人说明

(0)

相关推荐