满帮全栈一面:线上排障、缓存与全文检索
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 线上故障如何定位,Redis 锁的键怎么设计,获取失败后怎么处理?
- 性能瓶颈如何定位,本地缓存怎样刷新、过期并统计命中率?
- 为什么把可变配置放在存储中,而不是写死在代码里?
- 并发查询中某个分支失败后,整体请求应如何处理?
- 帖子详情和评论在高并发下各有什么瓶颈?
- 为什么引入 Elasticsearch,如何同步 MySQL 数据并完成一次查询?
- 什么是深分页,如何优化?
- 函数、隐式类型转换和联合索引条件会怎样影响执行计划?
- 同类内部调用带事务注解的方法,为什么可能不生效?
- Java 为什么使用泛型,什么是类型擦除?
《参考解析》
深分页
先确定页面是否需要随机跳转。连续翻页可以携带上一页的排序值,用游标继续查;排序值要有唯一字段兜底。Elasticsearch 中可采用 search_after,数据持续变化时结合一致的查询视图,避免翻页期间顺序漂移。代价是不能像 offset 那样随意跳到任意一页。
数据库和搜索索引同步
把 MySQL 作为事实来源,通过变更日志或可靠消息更新索引。消费者按主键和版本幂等写入,保留失败重试与定期校验。这里通常是最终一致,要能回答更新刚提交但搜索尚未刷新时,产品如何显示。
事务调用路径
Spring 的代理只有在调用经过代理对象时才能织入事务。同类中的 this 调用不会自动绕回代理。把需要事务的操作放进独立服务,让调用关系经过注入的代理,通常比在业务代码里主动找自身代理更容易维护。