外观
Elasticsearch 与缓存分别优化了哪一段?
标准回答
我把搜索链路分成接口处理、检索和重复结果复用三部分。Fastify 负责 API,Elasticsearch 负责全文检索,缓存则用于减少相同查询反复访问检索系统。
优化时要先确认时间花在哪里。如果 Elasticsearch 查询本身慢,就检查字段映射、分词和查询逻辑;如果大量请求重复,缓存能减少回源;如果主要是接口层的额外处理,则需要优化服务链路。项目中我围绕索引结构、查询和接口做过优化,也通过缓存减少重复检索与服务器负载。
缓存的价值和代价要一起看。同一道题被多次查询,可以复用结果,但题库更新后如果缓存不失效,就可能持续返回旧答案。因此缓存键要体现影响结果的参数,更新和过期策略也要与数据时效要求一致,不能只追求命中率。
具体定位时,我会把接口总耗时与下游搜索耗时拆开,再看慢查询、资源和请求分布。没有改动前后数据时,不能把全部性能收益归给缓存;现有材料没有说明缓存存储技术,因此我也不会直接把它说成 Redis。
关键机制
- 需要说明分词、字段映射和查询形式;题干中的数字、公式、选项和专有名词会影响匹配。
- 缓存键应包含影响结果的参数和数据版本;过期、更新、用户作用域和大热门同时失效需要策略。
- 定位慢查询要看搜索耗时、队列、分片、资源与端到端 Trace,而不是只看 Web 接口总时长。
通俗例子
同一题目被反复查询,缓存可减少重复检索;题库更新后若未失效,可能持续返回旧答案,所以时效与命中率必须一起考虑。
追问与回答
缓存击穿、穿透、雪崩怎样处理?
击穿是热点键失效后大量请求同时回源,可以考虑请求合并或受控刷新;穿透是反复查询不存在的内容,可以考虑校验、短期空结果缓存或合适的过滤;雪崩是大量键或缓存服务同时失效,使后端瞬时承压,可以考虑过期时间分散、限流和降级。这些是设计选项,项目已经确认的是使用缓存减少重复检索,不能把所有保护都说成已落地。
慢查询先改代码还是加机器?
我会先区分查询本身低效还是正常负载已经超过资源能力。如果是错误的查询、映射或重复请求,扩容可能只是把问题推迟;如果查询已经合理,CPU、内存、IO 或队列持续饱和,扩容也可能是必要措施。判断依据是端到端耗时和资源证据。紧急情况下可以先保护服务,再完成根因优化,但不能没有数据就固定选择其中一种。
易混淆点
材料没有证明用了 Redis、某种淘汰算法或具体分片配置,不应为了显得完整而补写。
参考资料
内容来源
- Android 技术札记 · 原条目
product-search