面试题答案
一键面试1. refresh参数基础理解
在Elasticsearch中,refresh
参数决定了文档更改(如索引、更新、删除)后多久对搜索可见。当执行GET API
时,refresh
参数可设置为true
、false
(默认)或具体时间(如1s
)。
2. refresh为true对性能和数据一致性影响
- 数据一致性:设置
refresh=true
确保了GET API
获取到的数据是最新的,因为它会强制Elasticsearch立即将内存中的数据刷新到磁盘,使新的文档更改对搜索可见,最大程度保证数据一致性。 - 性能影响:在高并发读操作场景下,频繁设置
refresh=true
会显著降低GET API
的性能。这是因为每次refresh
操作会触发以下Elasticsearch内部机制的开销:- 段合并:Elasticsearch以段(segment)为单位存储数据。
refresh
操作会创建新的段来存储新数据,频繁的refresh
会导致段数量快速增加。过多的小段会影响查询性能,因为查询时需要遍历更多的段。而且,Elasticsearch后台会定期进行段合并以优化存储和查询性能,但频繁的refresh
会使段合并频率增加,消耗更多的I/O和CPU资源。 - 缓存:Elasticsearch有各种缓存,如查询缓存和字段数据缓存。频繁的
refresh
操作会导致缓存失效频繁。因为新的段创建后,缓存中的数据可能不再准确,需要重新计算和缓存。这不仅增加了缓存管理的开销,还可能导致查询时需要重新从磁盘读取数据,降低了缓存命中率,进而影响GET API
的性能。
- 段合并:Elasticsearch以段(segment)为单位存储数据。
3. refresh为false(默认)对性能和数据一致性影响
- 数据一致性:
refresh=false
时,文档更改不会立即对搜索可见,可能存在一定的数据延迟,数据一致性相对较弱。 - 性能影响:性能相对较好,因为避免了频繁
refresh
带来的开销,段合并和缓存管理的压力较小,查询可以更高效地利用缓存和稳定的段结构。
4. refresh设置为具体时间(如1s)
- 数据一致性:在指定时间间隔内(如1秒)进行一次
refresh
,在数据一致性上介于refresh=true
和refresh=false
之间,能在一定程度上保证数据的及时性。 - 性能影响:相比
refresh=true
,性能有所提升,因为减少了refresh
的频率,但仍会有一定的段合并和缓存管理开销,只是频率低于refresh=true
的情况。