前言
对于大厂面试,我首先想要强调的一点就是心态真的很重要,是决定你在面试过程中发挥的关键,若不能正常发挥,很可能就因为一个小失误与offer失之交臂,所以一定要重视起来。另外提醒一点,充分复习,是消除你紧张的心理状态的关键,但你复习充分了,自然面试过程中就要有底气得多。
另外我这里准备了一线大厂面试资料和我原创的超硬核PDF技术文档,以及我为大家精心准备的多套大厂面试题(不断更新中),有需要的朋友点击这里备注csdn,自行下载即可希望大家都能找到心仪的工作!
RPC原理
为什么会出现RPC?
-
RPC(Remote Procedure Call Protocol)——远程过程调用协议。
-
一般来说,自己写程序然后本地调用,这种程序的特点是服务的消费方和提供方。当我们进入公司时,面对的很可能就是成千上万的服务提供方,这时候就需要使用RPC来进行远程服务调用。RPC将原来的本地调用转变为调用远端的服务器上的方法,给系统的处理能力和吞吐量带来了近似于无限制提升的可能。
RPC的组成
-
客户端:服务的调用方
-
客户端存根:存放服务端的地址消息,再将客户端的请求参数打包成网络消息,③然后通过网络远程发送给服务方。
-
服务端:真正的服务提供者。
-
服务端存根:接收客户端发送过来的消息,将消息解包,并调用本地的方法。
如何做到透明化远程服务调用?
-
动态代理,把本地调用代理成网络调用
-
如何进行服务发布?(Zookeeper)
-
如何进行序列化与反序列化?(Protobuf、Thrift、Avro)
-
如何进行通信?(NIO—>Netty)
-
HashMap原理
Redis缓存回收机制
数据过期:
-
定时删除策略:Redis启动一个定时器监控所有的key,一旦有过期的话就进行删除(遍历所有key,非常耗费CPU)
-
惰性删除策略:获取key的时候判断是否过期, 过期则进行删除
-
Redis采用的方式:①(随机抓取一部分key进行检测)+②
内存淘汰:
-
noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。(Redis 默认策略)
-
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 Key。(LRU推荐使用)
-
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 Key。
-
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 Key。这种情况一般是把 Redis 既当缓存,又做持久化存储的时候才用。
-
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 Key。
-
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 Key 优先移除。不推荐。如果没有对应的键,则回退到noeviction策略。
Redis主从同步
主从复制作用
-
数据冗余
-
故障恢复(服务冗余)
-
负载均衡
-
读写分离(主节点写操作、从节点读操作)
主从复制过程
-
连接建立阶段
-
步骤1:保存主节点信息
-
步骤2:建立socket连接
-
步骤3:发送ping命令
-
步骤4:身份验证
-
步骤5:发送从节点端口信息
-
数据同步阶段
-
从节点向主节点发送psync命令
-
根据主从节点当前状态的不同,可以分为全量复制和部分复制
-
命令传播阶段
-
主从节点进入命令传播阶段;在这个阶段主节点将自己执行的写命令发送给从节点,从节点接收命令并执行,从而保证主从节点数据的一致性。
-
介绍全量复制和部分复制
-
全量复制:用于初次复制或其他无法进行部分复制的情况,将主节点中的所有数据都发送给从节点,是一个非常重型的操作。
-
部分复制:用于网络中断等情况后的复制,只将中断期间主节点执行的写命令发送给从节点,与全量复制相比更加高效。需要注意的是,如果网络中断时间过长,导致主节点没有能够完整地保存中断期间执行的写命令,则无法进行部分复制,仍使用全量复制。
-
主从复制缺点:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。
为什么会有哨兵机制?
- 在主从复制的基础上,哨兵实现了自动化的故障恢复。
哨兵机制作用?
-
监控(Monitoring):哨兵会不断地检查主节点和从节点是否运作正常。
-
自动故障转移(Automatic failover):当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。
-
配置提供者(Configuration provider):客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。
-
通知(Notification):哨兵可以将故障转移的结果发送给客户端。
哨兵机制节点组成?
-
它由两部分组成,哨兵节点和数据节点:
-
哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。
-
数据节点:主节点和从节点都是数据节点。
哨兵机制原理?
-
定时任务:每个哨兵节点维护了3个定时任务。定时任务的功能分别如下:通过向主从节点发送info命令获取最新的主从结构;通过发布订阅功能获取其他哨兵节点的信息;通过向其他节点发送ping命令进行心跳检测,判断是否下线。
-
主观下线:在心跳检测的定时任务中,如果其他节点超过一定时间没有回复,哨兵节点就会将其进行主观下线。顾名思义,主观下线的意思是一个哨兵节点“主观地”判断下线;与主观下线相对应的是客观下线。
-
客观下线:哨兵节点在对主节点进行主观下线后,会通过sentinel is-master-down-by-addr命令询问其他哨兵节点该主节点的状态;如果判断主节点下线的哨兵数量达到一定数值,则对该主节点进行客观下线。
-
选举领导者哨兵节点:当主节点被判断客观下线以后,各个哨兵节点会进行协商,选举出一个领导者哨兵节点,并由该领导者节点对其进行故障转移操作。监视该主节点的所有哨兵都有可能被选为领导者,选举使用的算法是Raft算法;Raft算法的基本思路是先到先得:即在一轮选举中,哨兵A向B发送成为领导者的申请,如果B没有同意过其他哨兵,则会同意A成为领导者。选举的具体过程这里不做详细描述,一般来说,哨兵选择的过程很快,谁先完成客观下线,一般就能成为领导者。
-
故障转移:选举出的领导者哨兵,开始进行故障转移操作,该操作大体可以分为3个步骤:
-
在从节点中选择新的主节点:选择的原则是,首先过滤掉不健康的从节点;然后选择优先级最高的从节点(由slave-priority指定);如果优先级无法区分,则选择复制偏移量最大的从节点;如果仍无法区分,则选择runid最小的从节点。
-
更新主从状态:通过slaveof no one命令,让选出来的从节点成为主节点;并通过slaveof命令让其他节点成为其从节点。
-
将已经下线的主节点(即6379)设置为新的主节点的从节点,当6379重新上线后,它会成为新的主节点的从节点。
哨兵机制缺点
- 写操作无法负载均衡;存储能力受到单机的限制。(Redis集群解决了该情况)
Zookeeper锁是如何实现的?
-
一般使用Curator进行使用Zookeeper锁,例如有两个客户端A和客户端B,首先A先在锁节点下创建例如01子节点的锁,然后再获取节点信息,发现自己的01节点排名第一,那么就获得锁。
-
客户端B也需要获取锁,现在锁节点下创建例如02的子节点,然后再获取锁节点信息,发现锁节点信息为[01,02],并不排第一,因此获取不到锁,客户端B会在他的顺序节点的上一个顺序节点加一个监听器。
-
当客户端A使用完锁,删除01节点,客户端B获取到01删除的监听,然后发现自己的02节点排名第一,那么就获取到锁。
数据库是如何调优的?
-
数据表加合适的索引
-
针对执行计划进行优化
-
根据慢sql进行优化
-
加缓存
-
参数调优
git rebase命令发生了什么?
- rebase命令可以帮我们把整个提交历史变成干净清晰的一条线。
最后
最后为大家准备了Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。有需要的朋友点击这里备注csdn,自行下载即可,以上内容中,我谈及到的学习方法、学习面试资料,均可以免费分享给大家,希望大家进到自己想进的公司,共勉!
还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书一起免费分享给大家!