字节跳动测试开发二面(1hour)
面试官一开始给的压力很足,差点把家乡话给我逼出来,聊了一会就好了,增长了压力面试的经验。
主要应该是关注项目是不是自己做的。
1. 自我介绍
2. 介绍项目,开始深挖
3. 多级缓存。
4. redis缓存更新机制
5. redis的LRU机制
6. redis集群(还不怎么会)
7. redis持久化
8. 继续介绍项目
9. ElasticSearch检索机制
10. ElasticSearch怎么使用
11. 项目里RabbitMq起到了什么作用
12. RabbitMq防止数据丢失?
13. 当数据量变大的时候,数据堆积会怎么样(没有答出来),面试官说可以使用限速
14. 继续介绍项目
15. redis 主从复制,哨兵机制
16. redis集群(没答出来)
17. 继续介绍项目(挖到数据库表怎么实现,哥们我2月做的项目现在问我有什么外键
,不要啊哥们)
18. ThreadLocal原理
19. ThreadLocal用来干啥
20. 项目有Java反射吗
21. 微信收发红包写些测试用例,从收发分别考虑
算法:
#牛客AI配图神器#最长不重复子串。
写测试用例
---------------
许愿二面过


update:6.26已offer
主要应该是关注项目是不是自己做的。
1. 自我介绍
2. 介绍项目,开始深挖
3. 多级缓存。
4. redis缓存更新机制
5. redis的LRU机制
6. redis集群(还不怎么会)
7. redis持久化
8. 继续介绍项目
9. ElasticSearch检索机制
10. ElasticSearch怎么使用
11. 项目里RabbitMq起到了什么作用
12. RabbitMq防止数据丢失?
13. 当数据量变大的时候,数据堆积会怎么样(没有答出来),面试官说可以使用限速
14. 继续介绍项目
15. redis 主从复制,哨兵机制
16. redis集群(没答出来)
17. 继续介绍项目(挖到数据库表怎么实现,哥们我2月做的项目现在问我有什么外键
18. ThreadLocal原理
19. ThreadLocal用来干啥
20. 项目有Java反射吗
21. 微信收发红包写些测试用例,从收发分别考虑
算法:
#牛客AI配图神器#最长不重复子串。
写测试用例
---------------
许愿二面过
update:6.26已offer
全部评论
4. Redis缓存更新机制
核心策略:
- 过期删除:通过 expire 设置键的过期时间,到期后由后台线程(惰性删除+定期删除)处理。
- 惰性删除:客户端访问时检查是否过期,过期则删除。
- 定期删除:每隔一段时间随机检查部分键,删除过期键(通过配置 hz 控制检查频率)。
- 主动更新:应用主动调用 set / del 等命令更新缓存,常见场景:
- 数据变更时(如数据库更新后),同步更新缓存。
- 缓存失效前(如提前30秒),后台线程主动刷新(“缓存预热”)。
- 淘汰策略:当内存不足时,按策略淘汰旧数据(如LRU、LFU、随机等,见第5点)。
5. Redis的LRU机制(Least Recently Used)
原理:
- 近似LRU:Redis并非严格实现LRU,而是采样少量键(默认5个),淘汰其中最久未使用的键,通过 maxmemory-samples 参数调整采样数量。
- 实现方式:每个键维护 lru 字段(记录最后一次访问时间),淘汰时比较采样键的 lru 值。
- 优化策略:
- Redis 4.0引入LFU(最不常用) 策略,结合访问频率和时间淘汰数据。
- 可通过 maxmemory-policy 配置淘汰策略,如 allkeys-lru (所有键中使用LRU)、 volatile-lru (仅过期键中使用LRU)。
6. Redis集群
核心架构(以Redis Cluster为例):
- 分片机制:
- 数据按哈希槽(Hash Slot)分布,共16384个槽,每个节点负责部分槽。
- 键通过 CRC16(key) % 16384 计算归属的槽,路由到对应节点。
- 节点角色:
- 主节点(Master):负责读写操作,维护数据和槽信息。
- 从节点(Slave):复制主节点数据,主节点故障时可自动选举为新主(通过Raft协议)。
- 高可用机制:
- 自动故障转移:当主节点下线,从节点通过投票成为新主,保证服务不中断。
- 数据冗余:每个主节点至少有一个从节点,避免单点故障。
- 集群通信:
- 节点间通过Gossip协议交换状态信息(如节点存活、槽分配),维护集群拓扑。
- 典型部署:
- 至少3个主节点(每个主带1个从),形成3主3从架构,保证容错性(最多允许1个主节点故障)。
补充:Redis集群的优缺点
- 优点:
- 支持海量数据(通过分片扩展内存)。
- 高可用性(故障自动转移)。
- 读写分离(从节点可承担读请求)。
- 缺点:
- 不支持多键事务(跨节点键无法原子操作)。
- 客户端需处理分片路由(或通过中间件如Codis、Twemproxy)。
- 集群扩展时需迁移数据(通过 redis-trib 工具自动迁移槽)。
在红包领取过程中,网络数据包不完整确实可能导致“已领取但金额未增加”的情况,具体原因和机制如下:
可能的原因分析
1. 网络通信中断与状态不一致
- 领取请求已提交但响应丢失:
用户点击“领取红包”后,客户端向服务器发送领取请求,服务器处理成功并标记红包为“已领取”,但返回给客户端的响应数据包在网络中丢失(如路由器故障、信号中断)。此时:
- 服务器端状态:红包已被领取,金额从红包池扣除。
- 客户端状态:未收到成功响应,界面可能显示“领取中”或失败,但实际服务器已完成处理。
- 结果:用户后续刷新时发现红包已被领取,但自己的余额未增加(因为服务器可能未完成余额入账的后续步骤,或入账请求因网络问题未成功)。
2. 分布式事务中的部分成功
- 红包系统通常采用分布式架构(如订单服务、账户服务分离):
- 领取红包时,服务器先在订单服务中标记红包为“已领取”,再调用账户服务增加用户余额。
- 若账户服务调用时网络数据包丢失(如超时),可能导致:
- 订单服务:红包状态已更新(已领取)。
- 账户服务:未收到入账请求,余额未增加。
- 结果:用户看到红包已被领取,但余额未变化。
3. 客户端本地状态错误
- 客户端可能因缓存或逻辑错误,错误显示“领取成功”:
- 例如,客户端在发送领取请求后,未等待服务器响应就自行更新界面状态为“已领取”,但实际服务器未处理请求,导致余额未增加。
- 这种情况属于客户端逻辑漏洞,与网络数据包不完整间接相关(如请求未真正发送成功)。
系统如何避免此类问题?
1. 分布式事务最终一致性
- 采用“事务补偿”机制(如TCC模式):
- 若账户入账失败,订单服务自动回滚红包状态,或触发重试机制,确保“领取”与“入账”要么都成功,要么都失败。
2. 幂等性设计
- 服务器对领取请求做幂等处理:
- 即使客户端重复发送领取请求(如网络重传),服务器通过唯一请求ID判断是否已处理,避免重复标记红包状态或重复入账。
3. 对账与补偿机制
- 定期对账:
- 后台定时检查红包状态与账户余额的一致性,发现“已领取但未入账”的记录时,自动补发金额或回滚红包状态。
- 客户端重试:
- 若用户发现余额未增加,可手动刷新或重试领取,客户端重新向服务器查询真实状态并同步余额。
典型场景示例
- 用户A领取红包时突然断网:
- 服务器已记录A领取红包,但向A的账户打款时网络中断,打款请求失败。
- 服务器后台对账时发现该记录,自动补发金额到A的账户,或标记红包为“未领取”并退回金额。
mark
大佬面试的哪个部门
相关推荐
06-16 00:14
电子科技大学 C++ 
点赞 评论 收藏
分享

点赞 评论 收藏
分享