腾讯视频面经,后端 Java 一面面经

腾讯视频面经,后端 Java 一面面经
最新回答
大鱼塘总裁

2023-08-02 21:05:05

腾讯视频后端Java一面面经核心问题及解答如下

1. 短链接生成原理及哈希冲突解决
  • 生成原理:短链接通过将原始长URL映射为唯一短码实现,常见方法包括:

    哈希算法:对长URL进行哈希(如MD5、MurmurHash),截取部分字符作为短码。

    自增ID编码:数据库存储长URL并分配自增ID,将ID转为62进制(a-z,A-Z,0-9)缩短。

    随机字符串:生成随机字符串并检查唯一性,效率较低。

  • 哈希冲突解决

    开放寻址法:冲突时按规则寻找下一个可用槽位(如线性探测)。

    链地址法:同一槽位用链表存储多个冲突值,适合高频冲突场景。

    布隆过滤器:预过滤重复URL,减少冲突概率。

2. 加快短链接重定向过程
  • 优化方案

    缓存预热:短码与长URL的映射关系提前加载到Redis等缓存,减少数据库查询。

    CDN加速:将短链接服务部署至CDN节点,降低延迟。

    异步处理:重定向请求直接返回302,后台异步更新缓存或日志。

3. TCP与UDP协议对比及TCP特性
  • 核心区别

    TCP:面向连接、可靠传输(ACK确认、重传)、流量控制(滑动窗口)、拥塞控制。

    UDP:无连接、不可靠、高效(适用于直播、DNS等场景)。

  • TCP面向连接:通过三次握手建立虚拟连接,确保双方收发能力正常,数据按序到达。
  • 三次握手原因

    第一次:客户端发送SYN,确认自身发送能力。

    第二次:服务端回复SYN+ACK,确认自身收发能力。

    第三次:客户端发送ACK,确认服务端接收能力。

    四次挥手:因TCP半关闭特性(可单独关闭发送/接收),需更多步骤。

4. IO模式与Socket通信
  • IO模式

    阻塞IO:线程等待数据就绪,期间无法处理其他请求。

    非阻塞IO:线程轮询检查数据状态,CPU占用高。

    IO多路复用(如epoll):单线程监控多个Socket,事件驱动高效处理。

    异步IO:内核完成数据读写后通知应用,全程无阻塞。

  • Socket底层实现:需熟悉socket()、bind()、listen()、accept()、send()/recv()等函数调用流程。
5. MySQL事务隔离级别与MVCC
  • 隔离级别

    读未提交:可能读到未提交数据(脏读)。

    读已提交:解决脏读,但不可重复读。

    可重复读(InnoDB默认):同一事务内多次读取结果一致,解决幻读(通过间隙锁)。

    串行化:最高隔离,性能最低。

  • MVCC机制

    每行记录隐藏字段(创建版本号、删除版本号)。

    读操作基于“快照版本”,写操作生成新版本,实现非锁定读。

6. 服务并行与Redis分布式锁
  • 服务并行:通过多线程/多进程或分布式架构(如微服务)同时处理请求,提升吞吐量。
  • Redis分布式锁

    实现特性:利用Redis的原子性操作(如SETNX key value)和过期时间。

    流程:加锁时设置唯一值,解锁时校验值并删除,避免误删他人锁。

    Redlock算法:多Redis节点加锁,提升可靠性。

7. 缓存穿透及解决方案
  • 问题描述:大量请求查询不存在的数据,绕过缓存直接打崩数据库。
  • 解决方案

    布隆过滤器:预过滤无效请求。

    缓存空值:将查询结果为NULL的键缓存短时间(如1分钟)。

    限流降级:对异常请求进行限流或返回默认值。

8. 并发下查库与回写缓存的交错问题
  • 问题场景:线程A查库后未更新缓存时,线程B查库并回写,导致缓存数据不一致。
  • 解决方案

    单线程更新:通过分布式锁或消息队列串行化操作。

    双删策略:先删缓存→查库→更新缓存→异步延时再删缓存。

    CAS操作:使用Redis的COMPARE AND SET保证原子性。

9. MQ消息去重
  • 实现方式

    唯一ID+Redis:为每条消息生成唯一ID,消费前检查Redis是否存在。

    数据库唯一索引:将消息ID存入数据库,利用唯一约束去重。

    消息幂等设计:业务逻辑支持重复消费无副作用(如数据库唯一键)。

10. 手撕算法:LeetCode 153(二分查找旋转数组最小值)
  • 题目分析:旋转数组(如[4,5,6,7,0,1,2])的最小值位于旋转点。
  • 解法

    二分查找:比较中间元素与右边界,若mid > right,最小值在右半区;否则在左半区。

    终止条件:当left == right时,找到最小值。

  • 代码示例
public int findMin(int[] nums) { int left = 0, right = nums.length - 1; while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] > nums[right]) left = mid + 1; else right = mid; } return nums[left];}

总结:面试涵盖短链系统设计、网络协议、数据库、并发控制、算法等核心知识点,需结合理论与实践深入理解。