2023-08-02 21:05:05
腾讯视频后端Java一面面经核心问题及解答如下:
1. 短链接生成原理及哈希冲突解决哈希算法:对长URL进行哈希(如MD5、MurmurHash),截取部分字符作为短码。
自增ID编码:数据库存储长URL并分配自增ID,将ID转为62进制(a-z,A-Z,0-9)缩短。
随机字符串:生成随机字符串并检查唯一性,效率较低。
开放寻址法:冲突时按规则寻找下一个可用槽位(如线性探测)。
链地址法:同一槽位用链表存储多个冲突值,适合高频冲突场景。
布隆过滤器:预过滤重复URL,减少冲突概率。
缓存预热:短码与长URL的映射关系提前加载到Redis等缓存,减少数据库查询。
CDN加速:将短链接服务部署至CDN节点,降低延迟。
异步处理:重定向请求直接返回302,后台异步更新缓存或日志。
TCP:面向连接、可靠传输(ACK确认、重传)、流量控制(滑动窗口)、拥塞控制。
UDP:无连接、不可靠、高效(适用于直播、DNS等场景)。
第一次:客户端发送SYN,确认自身发送能力。
第二次:服务端回复SYN+ACK,确认自身收发能力。
第三次:客户端发送ACK,确认服务端接收能力。
四次挥手:因TCP半关闭特性(可单独关闭发送/接收),需更多步骤。
阻塞IO:线程等待数据就绪,期间无法处理其他请求。
非阻塞IO:线程轮询检查数据状态,CPU占用高。
IO多路复用(如epoll):单线程监控多个Socket,事件驱动高效处理。
异步IO:内核完成数据读写后通知应用,全程无阻塞。
读未提交:可能读到未提交数据(脏读)。
读已提交:解决脏读,但不可重复读。
可重复读(InnoDB默认):同一事务内多次读取结果一致,解决幻读(通过间隙锁)。
串行化:最高隔离,性能最低。
每行记录隐藏字段(创建版本号、删除版本号)。
读操作基于“快照版本”,写操作生成新版本,实现非锁定读。
实现特性:利用Redis的原子性操作(如SETNX key value)和过期时间。
流程:加锁时设置唯一值,解锁时校验值并删除,避免误删他人锁。
Redlock算法:多Redis节点加锁,提升可靠性。
布隆过滤器:预过滤无效请求。
缓存空值:将查询结果为NULL的键缓存短时间(如1分钟)。
限流降级:对异常请求进行限流或返回默认值。
单线程更新:通过分布式锁或消息队列串行化操作。
双删策略:先删缓存→查库→更新缓存→异步延时再删缓存。
CAS操作:使用Redis的COMPARE AND SET保证原子性。
唯一ID+Redis:为每条消息生成唯一ID,消费前检查Redis是否存在。
数据库唯一索引:将消息ID存入数据库,利用唯一约束去重。
消息幂等设计:业务逻辑支持重复消费无副作用(如数据库唯一键)。
二分查找:比较中间元素与右边界,若mid > right,最小值在右半区;否则在左半区。
终止条件:当left == right时,找到最小值。
总结:面试涵盖短链系统设计、网络协议、数据库、并发控制、算法等核心知识点,需结合理论与实践深入理解。