【3】阿里面试题整理
[1]. ES架构,如何进行路由以及选主
路由:在Elasticsearch(ES)中,默认的路由算法是基于文档的_id。具体来说,Elasticsearch会对文档的_id进行哈希计算,然后对分片数量取模,以确定该文档应存储在哪个分片上。这个过程可以确保同一个文档始终路由到相同的分片上,除非分片数量发生变化。
选主:Elasticsearch使用Zen Discovery模块进行选主(Leader Election)。这个过程类似于一个Leader Election算法。每个节点都会参与投票,选举出一个合适的master节点。master节点负责管理集群的状态,例如分片的分配和元数据的维护。
[2]. 组合索引的使用及需要注意的问题。
组合索引是为了优化多条件查询而创建的,它会将多个列组合在一起作为索引。
只有当查询条件中包含了索引中最左边的列或最左边的几个列时,这个索引才能被使用。
为了让索引更高效,应该将选择性比较高的列放在前面,这样才能更快地筛选出数据。
组合索引有一定的维护成本,每次插入、更新或者删除数据的时候都需要更新索引,创建过多的索引会增加数据库的负担。
[3]. 主键索引与唯一索引的区别。
主键索引要求列值不能为NULL,而唯一索引允许存在NULL值。
一张表只能有一个主键索引,但可以有多个唯一索引。
主键索引通常是聚集索引,直接影响数据在磁盘上的存储方式,而唯一索引一般是非聚集的。
主键索引主要用于唯一标识表中的每一行数据,而唯一索引主要是用来确保特定列的数据唯一性。
[4]. 数据库与Redis的缓存一致性问题。
数据库和Redis的缓存一致性问题,主要是因为缓存和数据库之间的数据存在时间差,并且有多个并发操作可能会导致数据不一致。
为了解决这个问题,需要考虑两方面:缓存更新策略和一致性维护策略。
在缓存更新策略方面,最常用的是旁路缓存模式,即先查缓存,缓存没有再查数据库,并且把数据写入缓存,更新数据的时候,先更新数据库,然后删除缓存。
这种策略的好处是简单易用,缺点是首次查询会慢一些。
在一致性维护策略方面,最基本的是先更新数据库再删除缓存,但这种方式在并发时可能导致不一致,所以可以使用延时双删策略或者利用消息队列来实现最终一致性。
[5]. HashMap的扩容机制。
HashMap在初始化的时候会分配一个初始的容量,当HashMap的元素数量达到一个阈值(容量乘以负载因子)的时候,就会触发扩容。
扩容的时候,HashMap会创建一个新的数组,容量是原数组的2倍,然后把原数组中的元素重新计算hash值,并根据新的数组容量重新分配到新的数组中。因此,这是一个比较耗时的操作,会导致HashMap的性能下降,所以,如果在预知存储的数据量比较大的情况下,最好在初始化的时候设置一个合理的容量,避免频繁的扩容。