其它面试题


网络通信相关

TCP与UDP的区别;TCP协议的三次握手,四次挥手

网络通信的三要素


服务器相关

Apache和Apache Tomcat的区别是什么?

  • Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别
  • Apache是web服务器(静态解析,如HTML),tomcat是java应用服务器(动态解析,如JSP)
  • Tomcat只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但可以独立于apache运行
  • Apache和Tomcat是独立的,在同一台服务器上可以集成
  • Apache和Tomcat整合使用
    如果客户端请求的是静态页面,则只需要Apache服务器响应请求;
    如果客户端请求动态页面,则是Tomcat服务器响应请求,将解析的JSP等网页代码解析后回传给Apache服务器,再经Apache返回给浏览器端。
    这是因为jsp是服务器端解释代码的,Tomcat只做动态代码解析,Apache回传解析好的静态代码,Apache+Tomcat这样整合就可以减少Tomcat的服务开销。
  • APACHE+TOMCAT+JDK整合的好处:
    如果客户端请求的是静态页面,则只需要Apache服务器响应请求 如果客户端请求动态页面,则是Tomcat服务器响应请求
    因为jsp是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销

缓存

缓存击穿

是指缓存中某一个key失效,如果出现高并发,则直接查询数据库,导致系统崩溃

解决方案:

加锁: 分布式锁
基于redis实现分布式锁.
锁的本质是: 可以放过一个请求,去数据库里查询,让其他的请求处于睡眠状态,放过的请求;查询到数据,放到缓存中后,再唤醒其他的请求,其他请求就直接查询缓存了,给数据库减轻了压力.			
             

缓存穿透

是指用户查询一个在数据库中根本不存在的数据,(数据库中没有这条记录),那么我们
做缓存的时候,不向缓存中放入数据的话,会导致缓存穿透.
:不进缓存,直接进入数据库

解决方式:

代码判断
  if(数据库也没有数据){
  在缓存中设置一个null值
  set 49 null 
  expire 49  60*10  设置一个10分钟失效
}
        
        

缓存雪崩

是指在同一时刻,缓存中的多个key全部失效,如果出现高并发,则会直接查询数据库

可能导致系统崩溃

解决方案:

缓存key,不要设置同一过期时间! expire key timout

常见问题与解决方案

​1. 缓存穿透
​问题:恶意请求不存在的 Key,导致缓存未命中,直接查询数据库。
​解决方案:
缓存空值(如 @Cacheable(value = “users”, unless = “#result == null”) 改为缓存空对象)。
使用布隆过滤器(Bloom Filter)拦截非法 Key。
​2. 缓存雪崩
​问题:大量缓存同时失效,导致数据库压力骤增。
​解决方案:
设置随机过期时间(如 expireAfterWrite(30 + random.nextInt(10), TimeUnit.MINUTES))。
使用缓存预热(启动时加载热点数据)。
​3. 缓存击穿
​问题:热点 Key 失效瞬间,大量请求涌入数据库。
​解决方案:
使用互斥锁(如 Redis 的 SETNX)。
通过 @Cacheable(sync = true) 启用同步执行(仅 Spring 5.3+ 支持)。

消息队列

消息队列(Message Queue)是一种用于异步通信的中间件,通过解耦生产者和消费者,实现系统的高可用性、可扩展性和灵活性

RabbitMQ 的消息传递流程是怎样的

生产者发送消息到 Exchange,Exchange 根据路由规则将消息转发到对应的 Queue,消费者从 Queue 中获取消息

RocketMQ 的消息传递流程是怎样的?

生产者通过 NameServer 获取 Broker 路由信息,将消息发送到指定 Broker 的 Queue。
消费者订阅 Topic 并拉取消息,从 Queue 中读取数据

全文搜索

ElasticSearch

​ElasticSearch 的核心定位是什么?

​分布式搜索引擎:基于 Lucene,支持全文搜索、结构化搜索、数据分析。
​实时数据存储与检索:近实时(Near Real-Time)索引更新,默认 1 秒刷新。
​RESTful API:通过 HTTP 协议操作数据,支持 JSON 格式交互。

​ElasticSearch 的​核心组件有哪些?

​索引(Index)​:类似数据库的表,存储文档集合。
​分片(Shard)​:索引的物理分片,支持水平扩展。
​副本(Replica)​:分片的副本,提供高可用性和负载均衡。
​节点(Node)​:集群中的单个服务器实例。
​集群(Cluster)​:多个节点组成的逻辑单元,通过选举产生主节点(Master-Node)。

​ElasticSearch 的核心原理

​倒排索引(Inverted Index)​
​原理:将文档中的词项映射到包含该词项的文档列表。
​示例:
plaintext
词项 “apple” → 文档 [doc1, doc3, doc5]
词项 “banana” → 文档 [doc2, doc4]
​分布式架构

​分片与副本机制:
主分片(Primary Shard)负责写操作,副本分片(Replica Shard)同步主分片数据。
数据分布通过一致性哈希算法分配。

​集群发现与通信:
通过 Zen Discovery 模块实现节点发现和状态同步。
主节点负责协调分片分配和集群状态管理。

​ElasticSearch中match和term的区别

核心区别

​对比维度 match 查询 term 查询
​分词处理 对查询文本进行分词(Analyzer),生成词项列表。 不分词,直接按原词精确匹配。
​适用字段类型 适用于 text 类型字段(分词后的词项)。 适用于 keyword 类型字段(未分词的原始值)。
​查询逻辑 基于词项的相似度匹配(如 TF-IDF、BM25)。 完全匹配,不计算相关性。
​结果排序 按相关性排序(得分高低)。 按文档顺序(无相关性计算)。
​适用场景 全文搜索、模糊匹配、多词组合查询。 精确匹配、过滤特定值(如状态码、ID)。

​ElasticSearch 的索引与查询

​索引设计最佳实践
​合理选择字段类型:

​避免过度动态映射:预定义字段类型,防止自动类型推断导致性能问题。
​查询类型与优化
​全文搜索:使用 match 查询,支持分词和评分。

​精确查询:使用 term 或 terms 查询,适用于非分析字段(如 keyword)。
​复合查询:结合 bool、must、should 实现复杂逻辑。
​聚合分析:

​ElasticSearch 的性能优化

​索引优化
​刷新间隔(Refresh Interval)​:增大间隔减少磁盘 I/O(默认 1 秒)。

​查询优化
​分页优化:避免深度分页(from + size),改用 search_after 或 scroll。

​路由优化:通过 routing 参数将相关数据存储在同一分片,减少跨分片查询。

​ElasticSearch 的常见问题与解决方案

  • ​数据不一致问题
    ​原因:副本同步延迟或节点故障。
    ​解决:监控副本状态,确保 number_of_replicas 合理,避免网络分区。
  • ​查询性能瓶颈
    ​原因:全表扫描、未命中索引。
    ​解决:使用 _explain 分析查询计划,优化索引和查询语句。
    ​- 集群脑裂(Split Brain)​
    ​原因:网络分区导致多个主节点。
    ​解决:配置 discovery.zen.minimum_master_nodes 至少为 (number_of_master_nodes / 2) + 1。

ElasticSearch 是分布式搜索与分析领域的核心工具,掌握其核心原理(倒排索引、分片副本)、查询优化(聚合、路由)、集群管理(高可用、监控)及故障排查是面试成功的关键。
实际应用中需结合业务场景设计合理的索引策略,并通过性能调优(JVM、分页、缓存)保障系统稳定性。

Linux


文章作者: zrh
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zrh !
  目录