字节 后端开发一到三面 许愿offer

字节一面

Java用多久

技术书籍

HashMap底层 数组加链表/红黑树(jdk8)

数组链表区别

Redis数据类型

字符串、数组(双端)、散列表、集合、有序集合(每个存储的值对应一个score,用于排序)

Redis 缓存穿透, 缓存击穿

缓存穿透

查询一个一定不存在的数据,数据既不存在于Redis中,也不存在于数据库中

解决方案

1. 布隆过滤器

维护一个bitmap,添加数据时,对一个key计算多个哈希,哈希值对应bitmap位设置为1。

当要查询时,对于一个key也是同样计算多个哈希,如果某个哈希值对应的bitmap值不为1,可以肯定该key一定不存在。

但如果各个哈希值对应bitmap的值都为一,也只是可能存在该key。

2. 对查询到的不存在结果做缓存,过期时间设置不会过长
3. 校验

缓存雪崩

缓存的数据设置了统一的过期时间,当某一时刻缓存同时过期,大量请求直接落到数据库上,就会对数据库造成很大压力甚至崩溃

解决方案

缓存过期时间随机分配,在原有过期时间上加上一个随机值
分级缓存
热点数据永不过期
互斥锁:控制读数据写缓存的线程数量
熔断机制,限流降级

流量达到阈值,直接返回“系统拥挤”之类的提示,防止过多的请求打在数据库上将数据库击垮,至少能保证一部分用户是可以正常使用,其他用户多刷新几次也能得到结果。

事后:开启Redis持久化机制,尽快恢复缓存数据

缓存击穿

类似于缓存雪崩,但缓存击穿是针对一个设置了过期时间的热点数据,该数据可能被大量并发请求访问。当该数据过期时,如果此时有大量并发请求访问,会在更新缓存前,这些请求就会落在数据库上,可能导致数据库崩溃。

解决方案

热点数据永不过期
互斥锁

Redis持久化

RDB快照

适合备份、灾难恢复

恢复大数据集时比AOF快

出现故障时丢失的数据比AOF多

数据集大时耗时长

AOF(append only file)

追加方式有每个写命令都同步,每秒同步,操作系统决定何时同步(no)

每秒同步情况下仍可以保持良好的性能,而且在故障时最多丢失一秒的数据

Redis可以在AOF文件体积较大时,自动在后台对AOF进行重写,重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。

AOF文件体积通常大于RDB文件体积

AOF处理巨大写入时会降低Redis性能

AOF相比快照的好处

见上

RabbitMQ 作用

削峰降流

业务解耦

异步通知

为什么不开个线程处理异步通知

  1. 第一是可以提高应用的稳定性,当程序崩溃后,写入外部消息队列的数据依旧是保存的

  2. 用线程的话,会占用主服务器资源,消息队列的话,可以放到其他机器上运行,让主服务器尽量多的服务其他请求

  3. 解耦更充分,架构更合理 多线程是在编程语言层面解决问题 消息队列是在架构层面解决问题

  4. 用线程池ExecutorService异步处理:我理解ExecutorService其实也是内部使用了队列(如LinkedBlockingQueue),所以从设计上,其实和使用中间件的消息队列是差不多一致的。只是这里应用服务器既充当生产者又充当消费者,也是消息队列中间件的实现者。这种应该适合非分布式的架构,比如简单的只有一台服务器。

RabbitMQ 最终一致性

消费端可以通过MQ自身的重发机制来保证消息被消费

基于事务消息(只有RocketMQ支持)

  1. 生产者预发送一个消息给MQ

  2. MQ存储该消息为待发送状态

  3. MQ向生产者返回ACK

  4. 生产者执行业务逻辑

  5. 生产者将业务逻辑执行结果发送给MQ

  6. MQ根据执行结果选择将消息删除或设置为可发送

  7. 发送状态为可发送的消息给消费者

  8. 消费者返回ACK

基于本地消息

核心在于执行业务操作时,将一条消息数据记录到数据库,并且消息数据的记录与业务数据的记录必须在同一个事务内完成

通过一个定时任务轮询数据库中状态为待发送的消息,然后将消息发送给MQ,发送成功后MQ返回确认

弊端在于每个业务系统都需要在对应的业务库创建一张消息表来存储消息。针对这个问题,我们可以将该功能单独提取出来,做成一个消息服务来统一处理

基于消息服务

模拟了事务消息的预发送过程

生产者会预发送一个消息到消息服务,并执行业务逻辑

消息服务将消息存储为待发送状态

业务逻辑执行完成后生产者会向消息服务发送业务执行结果

消息服务设置定时任务,轮询长时间未变为可发送状态的消息,并通过生产者提供的确认接口检查业务执行结果,如果业务成功,将消息修改为可发送状态。

消息服务还有另一个定时任务,轮询可发送状态的消息,并将其发送给MQ

HTTP HTTPs

HTTPS是HTTP加上TLS或者SSL

HTTP的数据是明文传输的存在消息窃听,身份伪造,数据篡改等安全隐患

HTTP 有以下安全性问题:

  • 使用明文进行通信,内容可能会被窃听;

  • 不验证通信方的身份,通信方的身份有可能遭遇伪装;

  • 无法证明报文的完整性,报文有可能遭篡改。

HTTPS通过使用安全层,实现了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。

加密

服务器生成一对公钥私钥

将公钥发送给客户端

客户端生成对称密钥

客户端使用公钥对对称密钥加密

将加密后的对称密钥发送给服务端

开始通信

认证

使用证书进行认证

image-20210408204320093

a.服务方S向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息并申请认证;

b.CA通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;

c.如信息审核通过,CA会向申请者签发认证文件-证书。 证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA的信息、有效时间、证书序列号等信息的明文,同时包含一个签名; 签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA的私钥对信息摘要进行加密,密文即签名;

d.客户端 C 向服务器 S 发出请求时,S 返回证书文件;

e.客户端 C读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;

f.客户端然后验证证书相关的域名信息、有效时间等信息;

g.客户端会内置信任CA的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA的证书,证书也会被判定非法。

完整性保护

提供报文摘要功能进行完整性保护

HTTPS由于需要进行加密解密等过程,速度更慢

证书费用昂贵

对称加密非对称加密

对称加密,通信双方使用同一密钥进行加密解密,需要考虑如何将密钥传递给对方

非对称加密,加密和解密使用不同密钥,公钥加密,私钥解密

对称加密安全隐患

明文传输对称密钥可能被第三方窃取

截获公钥伪造身份可能有什么隐患

中间人截获服务器发送的公钥,向服务端发送公钥加密后的对称密钥,与服务端建立通信

中间人自己生成一对公钥和私钥,将公钥发送给客户端,从而与客户端建立通信

中间人可以截获客户端和服务器端通信的内容并加以篡改。

进程线程

进程通信

僵尸进程

算法

  1. 重复字符交替输出

  2. 0 --> 01 1 --> 10

字节二面

static

静态变量存储位置

静态变量初始化过程

synchronized修饰静态字段

Class类型对象存储位置

讲一下synchronized

死锁

死锁预防

算法

完全二叉树最后一个节点

先增后减数组,查找k

字节三面

项目介绍一下

Redis会什么说一下吧

持久化

缓存穿透、击穿、雪崩

Redis数据结构,用过什么

一致性哈希了解吗

sql调优,索引没命中就要全表扫描怎么优化呢

数据库事务隔离级别

考研相关

算法 二叉树两个不同叶子结点最近公共祖先


#字节跳动##面经##Java工程师#
全部评论
更新进度,上周四面技术,这周问完凉了
点赞 回复 分享
发布于 2021-04-26 15:58
楼主拿到offer了吗
点赞 回复 分享
发布于 2021-04-20 15:10
楼主,索引没命中就要全表扫描怎么优化怎么答的,答索引优化原则?
点赞 回复 分享
发布于 2021-04-15 13:36
楼主你好,请问你是实习、校招还是社招?
点赞 回复 分享
发布于 2021-04-14 22:26

相关推荐

一、开启投递:四处碰壁,陷入迷茫​3 月 12 日,我满怀期待地开启了简历投递之旅。起初,我将目光投向实习群和校招官网的实习岗位,觉得这些信息更及时精准,但一周过去,投递的十几份简历石沉大海。3 月 20 日起,我开始在大厂广泛投递,腾讯、阿里、字节跳动、京东、拼多多、华为等 Java 开发岗都成了我的目标。然而现实残酷,大部分投递仅显示 “简历筛选中” 便再无进展。​看着身边同学陆续收到面试邀约,我陷入了自我怀疑。反复检查简历,发现可能存在项目描述不够精炼、技术亮点未突出的问题;也担心自己对底层原理的掌握不够深入。那段时间,焦虑和迷茫时常笼罩着我,甚至开始自我怀疑。​二、柳暗花明,初现曙光​3月底4 月初,我开始陆续接到了面试。面试准备时,我从小红书、牛客等渠道查询面经,润色自我介绍,并根据每个岗位的 JD进行定制化面试题目准备。4 月 10 日,我迎来腾讯一面。面试官先让我介绍最有成就感的项目,我详细阐述了用 Seata 解决分布式事务的全过程。随后,针对 Spring 循环依赖问题,从三级缓存原理到实际应用场景展开追问,虽然部分细节回答得不够完美,但整体表现还算稳定。4 月 18 -25日,进行了二三面,注意聚焦系统设计,要求设计一个高并发秒杀系统,我从限流(Guava RateLimiter、Sentinel)、缓存预热、消息队列削峰填谷等方面进行分析,得到了面试官认可。4 月 27 日,我收到了录用评估。​但我并未停下脚步,继续参与其他公司面试。阿里的面试让我备受打击,4 月 18 日的一面中,面试官对 JVM 垃圾回收算法刨根问底,涉及 G1 收集器的分区设计和并发标记细节,很多问题我答得磕磕绊绊,最终止步一面。字节跳动的面试更侧重算法,4 月 22 日的面试中,现场两道算法题被爆杀。京东和拼多多的面试贴近业务,常问实际场景的技术解决方案。​华为的面试流程漫长,从 4 月 25 日的技术一面,到 5 月 5 日的综合主管面,每一轮都很压力。目前在泡池子。​在这一系列面试中,我积累了宝贵经验:面试前要对简历项目倒背如流,预想所有可能追问点;回答问题先理清逻辑,再分点阐述;遇到不会的问题,大方承认并尝试说出解题思路,展现学习能力。​三、收获成果(AI润色过)手握腾讯和华为的 offer,我陷入了幸福的纠结。腾讯的岗位在微信事业群,作为国民级应用,能接触到亿级流量的系统设计,团队氛围年轻活跃,技术大牛云集;华为的岗位聚焦云计算领域,公司在通信和云技术实力强劲,项目技术挑战性高,职业发展路径清晰。​为了做出抉择,我查阅大量行业报告,对比两家公司业务发展趋势和技术生态;联系在腾讯、华为工作的学长学姐,了解工作强度、成长机会和团队文化。经过反复权衡,我最终选择了腾讯。我认为,微信海量用户带来的复杂业务场景,能让我在高并发、分布式系统设计上快速成长,这与我未来从事互联网后端开发的职业规划高度契合。​回顾这段找实习的心路历程,有过焦虑、迷茫和自我怀疑,但更多的是成长与收获。它让我明白,求职之路从不会一帆风顺,唯有坚持不懈、不断调整、持续提升,才能抵达理想彼岸。希望我的经历能给正在求职的 26 届同学一些启发,祝愿大家都能斩获心仪的 offer!       
投递腾讯等公司8个岗位
点赞 评论 收藏
分享
评论
12
171
分享

创作者周榜

更多
牛客网
牛客企业服务