网络通信相关
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、分页、缓存)保障系统稳定性。