面试题答案
一键面试1. 使用Count API结合DSL实现统计
POST /电商商品索引/_count
{
"query": {
"bool": {
"filter": [
{
"range": {
"价格": {
"gte": 100,
"lte": 200
}
}
},
{
"term": {
"类别": "电子产品"
}
}
]
}
}
}
上述DSL语句使用bool
查询,其中filter
子句用于组合条件。range
查询用于筛选价格在100到200之间的商品,term
查询用于筛选类别为“电子产品”的商品。_count
API会返回满足这些条件的文档数量。
2. 高并发场景下可能遇到的性能问题及解决方案
性能问题
- 资源竞争:高并发请求可能导致对ElasticSearch集群资源(如CPU、内存、网络带宽)的激烈竞争,影响查询性能。
- 索引压力:大量的统计查询可能会对索引造成额外压力,影响索引的正常维护(如刷新、合并等操作)。
- 缓存失效:如果使用缓存来存储统计结果,高并发下缓存可能频繁失效,导致大量请求穿透到ElasticSearch进行实时查询。
解决方案
- 集群优化:
- 增加资源:适当增加ElasticSearch集群的节点数量,提高集群的处理能力。根据业务需求合理分配CPU、内存等资源。
- 优化配置:调整ElasticSearch的配置参数,如
indices.memory.index_buffer_size
(控制索引缓冲区大小)、search.max_buckets
(限制聚合查询的桶数量)等,以适应高并发场景。
- 索引设计优化:
- 数据建模:对商品数据进行合理的建模,例如使用父子文档或嵌套文档结构,减少数据冗余,提高查询效率。
- 字段类型选择:选择合适的字段类型,例如对于价格字段使用
float
或integer
类型,避免使用text
类型进行数值查询。
- 缓存策略:
- 分布式缓存:使用分布式缓存(如Redis)来缓存统计结果。在高并发场景下,先从缓存中获取数据,如果缓存中不存在,则查询ElasticSearch并将结果存入缓存。设置合理的缓存过期时间,避免缓存雪崩。
- 缓存预热:在系统启动或业务低峰期,提前将常用的统计结果缓存到Redis中,减少高并发时的缓存穿透。
- 限流与降级:
- 限流:使用限流算法(如令牌桶算法、漏桶算法)对请求进行限流,控制单位时间内到达ElasticSearch的请求数量,防止集群被高并发请求压垮。
- 降级:在系统出现性能瓶颈时,实施降级策略,例如返回一个默认的统计结果或提示信息,避免长时间等待或系统崩溃。