2024年4月最新腾讯后端校招实习面经概答:面面俱到的考察
嗨~我是可拟雀,一个后端开发工程师,毕业于某985大学,目前供职于bat某大厂核心部门后端。日常分享最新面经答案,希望在大环境不好的当下能帮到你,让你多积累面试经验。需要内推或者面经合集请评论哦。
缓存击穿问题 缓存击穿的概念,如何进行解决的? - 分布式锁: - 逻辑过期: 有没有一种既能保证高可用性质的同时,又保证数据的一致性? 2.缓存穿透问题 缓存穿透的概念以及它的解决方法 - 缓存空对象 - 布隆过滤器 缓存空对象它的缺点 就是可能会出现数据不一致的情况,例如本来缓存了一个空对象后,但是后续数据库中插入了一条相关的数据。这时候再次访问redis返回的却是null值 布隆过滤器如何实现的 布隆过滤器中你的hash是经过了几次呢,hash函数是怎么确定的,以及为什么是这个次数呢 布隆过滤器你是如何使用hash的 布隆过滤器中的元素可以删除吗 如果热点数据进行了修改,那么布隆过滤器中应该怎么变化 2.分布式锁是如何实现的 这个说是使用了setnx命令后就没怎么去询问了 3.询问了项目的难点 4.Redis为什么那么快 5.select和epoll的区别 4.数据库相关 首先给了两个表,以及这两个表中存储的数据,然后还有一个查询的结果,这个SQL语句是什么 你知道MySQL的执行引擎吗 因为这个SQL语句是一种连接语句,并且出现了NULL值,就问了我相关左外连接和右外连接的区别。 给我了一条语句,select * from table where a = 1,问我它的执行流程,以及它在索引中是怎么走的。 聚簇索引非聚簇索引它们的存储的分别是什么东西 问了隔离级别有哪些隔离级别 MVCC是怎么实现的 可重复读和读已提交的区别 幻读和不可重复读的区别 可重复读完全解决了幻读的问题吗? 5.TCP协议 TCP是如何保证它的可靠性的 拥塞控制和流量控制有什么区别 那你知道拥塞控制的流程吗 6.设计题 去重操作 二分查找 多线程使用
答案概答:
1. 缓存击穿问题
缓存击穿是指当某个热点数据过期时,大量并发请求同时访问该数据,由于此时缓存中没有该数据,导致所有请求都直接访问数据库,给数据库带来巨大压力。
解决方案:
- 分布式锁: 使用Redis的setnx命令或其他分布式锁机制,确保同一时间只有一个请求去查询数据库并更新缓存。
- 逻辑过期: 不设置具体的过期时间,而是在缓存中为每个数据项记录一个逻辑过期时间。访问数据时,检查逻辑过期时间,若已过期则重新加载数据并更新缓存。
保证高可用性与数据一致性:
使用Redis的主从复制或集群模式确保高可用性,同时结合分布式锁和缓存更新策略,确保在数据更新时能够同步到缓存,保持数据一致性。
2. 缓存穿透问题
缓存穿透是指查询一个不存在的数据,由于缓存中也没有,导致每次请求都直接穿透到数据库,而数据库中也找不到该数据。
解决方案:
- 缓存空对象: 对于不存在的数据,在缓存中存储一个空对象或特殊标记。但需注意定期清理这些空对象,避免长时间占用缓存空间。
- 布隆过滤器: 使用布隆过滤器过滤掉不存在的数据请求,减少对数据库的无效查询。但布隆过滤器存在误报率,即可能将存在的数据误判为不存在。
布隆过滤器实现细节:
布隆过滤器使用位数组和多个哈希函数实现。对于每个元素,通过哈希函数计算其在位数组中的位置,并将对应位置设为1。查询时,同样计算元素在位数组中的位置,如果所有位置都为1,则认为元素可能存在;否则认为元素一定不存在。布隆过滤器的哈希函数次数和具体实现根据应用场景和性能要求来确定。
布隆过滤器元素删除与热点数据修改:
布隆过滤器不支持直接删除元素,因为将位数组中的某个位置设为0可能会影响其他元素的判断。当热点数据修改时,需要重新计算修改后数据的哈希值,并更新布隆过滤器中的对应位置。
3. 分布式锁实现
分布式锁通常使用Redis的setnx命令或其他机制实现。基本思路是多个客户端尝试获取锁,只有一个客户端能够成功获取并执行操作,其他客户端则等待锁释放。操作完成后,释放锁以便其他客户端可以获取。
4. Redis为什么那么快
- 内存存储:所有数据都存储在内存中,避免了磁盘I/O操作。
- 单线程模型:避免了多线程间的上下文切换和锁竞争。
- 高效的数据结构和算法:针对不同数据类型使用不同的数据结构和算法,实现高效读写。
- I/O多路复用:使用epoll等机制实现高并发I/O处理。
5. select和epoll的区别
select和epoll都是I/O多路复用的机制,用于处理大量并发I/O操作。主要区别在于性能和扩展性:
- select能处理的文件描述符数量有限,且在文件描述符较多时性能下降明显。
- epoll则能够处理大量文件描述符,且性能稳定,适合高并发场景。
6. 数据库相关
- SQL语句编写:多做题就会了
- MySQL执行引擎: MySQL使用不同的执行引擎来处理SQL语句,如InnoDB和MyISAM。InnoDB支持事务和行级锁定,是常用的存储引擎。
- 左外连接和右外连接: 左外连接返回左表的所有记录以及右表中匹配的记录;右外连接则相反。
- 索引与查询流程: 对于
select * from table where a = 1
的查询,MySQL会首先检查a字段上是否有索引,若有则使用索引快速定位数据;否则进行全表扫描。 - 聚簇索引与非聚簇索引: 聚簇索引按照主键的顺序存储数据,非聚簇索引与数据存储顺序无关。聚簇索引查询效率通常更高。
- 隔离级别: MySQL的隔离级别包括读未提交、读已提交、可重复读和串行化。不同级别对并发控制和数据一致性有不同保证。
- MVCC(多版本并发控制): 是InnoDB实现可重复读隔离级别的一种技术,通过保存数据的多个版本来实现无锁读。
- 可重复读和读已提交的区别: 可重复读保证同一事务内多次读取同一数据的结果一致;读已提交则保证每次读取的都是最新数据。
- 幻读和不可重复读: 幻读是指在事务执行过程中,由于其他事务的插入操作,导致读取到的数据行数发生了变化
TCP协议
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过一系列机制来确保数据的可靠传输,主要包括以下几个方面:
数据分块与序号:TCP会将数据划分为合适大小的数据包,并为每个数据包分配一个序号。这样,接收方可以根据序号对失序的数据包进行重新排序,并且可以去重,丢弃重复的数据包。
校验和:TCP使用头部信息和数据进行校验,以确保传输过程中数据没有发生变化。如果数据被修改,校验和会不匹配,此时TCP会丢弃这个数据包。
超时重传机制:发送数据包后,TCP会启动定时器等待接收方的确认信息。如果超过一定时间都没有收到确认信息,TCP会重传该数据包。
流量控制:TCP连接的两方都有自己的缓冲区。接收方只允许发送方发送自己能承受的数据量。如果接收方处理不过来,会发送信号要求发送方降低发送速度,从而避免丢包。这是通过滑动窗口的大小改变来实现的。
拥塞控制:当网络发生拥塞时,TCP会减少数据的发送量,以防止过多的数据注入到网络中,使网络中的路由器或链路不至于过载。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络性能有关的所有因素。
拥塞控制和流量控制的区别:
- 流量控制是端到端的控制,关注的是发送方和接收方之间的数据流速度,防止接收方因缓冲区溢出而丢帧。
- 拥塞控制则是关注整个网络的状况,防止由于网络中瞬间的大量数据导致网络拥塞,从而影响数据的传输效率。
拥塞控制的流程:
TCP的拥塞控制主要包括慢开始、拥塞避免、快重传和快恢复等阶段。
- 慢开始:TCP连接建立后,拥塞窗口大小初始化为1,然后每经过一个往返时间RTT就将发送方的拥塞窗口大小乘以2,直到达到慢开始门限ssthresh。
- 拥塞避免:当拥塞窗口大小超过ssthresh后,使用拥塞避免算法,每经过一个RTT就将发送方的拥塞窗口大小加1。
- 快重传:如果发送方收到一个重复的ACK或者一个失序的报文段,就认为网络中可能发生了拥塞。此时,发送方会调整慢开始门限ssthresh和拥塞窗口大小,并执行慢开始算法。
- 快恢复:当发送方收到三个重复的ACK时,就认为网络中发生了严重拥塞。此时,发送方会调整ssthresh和拥塞窗口大小,并执行拥塞避免算法。
- 设计题
去重操作
去重操作通常用于处理重复的数据。在编程中,可以使用集合(Set)数据结构来实现去重,因为集合中的元素是唯一的。对于数组或列表,可以通过遍历并检查每个元素是否已存在于结果集合中来实现去重。
二分查找
二分查找是一种在有序数组中查找特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
多线程使用
Thread类或实现Runnable接口来创建线程。多线程可以提高程序的执行效率,也得注意线程间的同步和通信问题,以避免数据竞争和不一致。在实际应用中,可以使用锁、条件变量、信号量等机制来实现线程间的同步。
#面经##后端##腾讯##实习#专注于最新各大厂最新面筋解析