如果让你统计每个接口每分钟调用次数怎么统计?最简单的可以使用 ConcurrentHashMap + AtomicInteger + 定时任务实现内存中的统计。
ConcurrentHashMap 的 key 为方法的名称、value 为 AtomicInteger 类型,记录调用次数,可以通过 aop 切面实现每个方法调用都记录到 ConcurrentHashMap 中,然后利用定时任务每...
分布式锁一般都怎样实现?分布式锁需要实现多个应用实例之间的临界资源竞争,因此它需要依赖三方组件才能实现这样的功能。
常见依赖 Redis、ZooKeeper 来实现分布式锁。
Redis 实现基于缓存实现分布式锁性能上会有优势,可以使用 Redis SETNX (SET if Not eXists)实现分布式锁。
注意锁需要设置过期时间,防止应用程序崩溃导致锁没有释放而阻塞后面的所有操作。
...
如何解决 Elasticsearch 集群中的双 Master 问题?回答重点可以采取以下措施:
1)确保集群中有一个明确的主节点(Master)选举机制。
2)正确配置 minimum_master_nodes 参数。据官方建议,这个参数的值应该设置为 (N/2) + 1,其中 N 是集群中的主节点数(Master-eligible,可以认为是有资格当选主节点的节点)。这可以防止发生脑裂(...
Feign 和 Dubbo 的区别?回答重点Dubbo 是一个 RPC 框架,其支持 HTTP 调用和 RPC 调用。
Feign 是一个 HTTP 客户端,它通过 HTTP 协议进行通信,通常用于调用 RESTful API。
我们这里还是使用表格的方式来列举,如下所示:
如何在确保数据一致性的前提下更新 Elasticsearch 的倒排索引?回答重点在确保数据一致性的前提下,更新 Elasticsearch 的倒排索引,一般情况下可以使用以下方法:1)采用乐观并发控制(Optimistic Concurrency Control, OCC)。2)使用版本号进行控制。3)使用 ElasticSearch 批量API (Bulk API) 进行批量更新。4)及...
什么是倒排表的 FOR 和 RBM 压缩算法?工作原理分别是什么?回答重点倒排表是搜索引擎中一种常见的数据结构,用于快速查找包含特定词的文档。FOR (Frame of Reference) 和 RBM (Roaring Bitmap) 是两种压缩倒排表的算法。
1)FOR (Frame of Reference):
定义:是一种基于固定基准值的压缩算法。
工作原理:将一个数据块内的所有值...
什么是 FST?在 Elasticsearch 中有哪些应用场景?回答重点FST是Finite State Transducer的缩写,翻译过来叫有限状态转换器。它是一种数据结构,用于高效地存储和操作有限状态自动机(Finite State Automaton, FSA),特别擅长处理像字符串的前缀压缩和自动补全等需要高效查询的情况。在Elasticsearch中,FST被广泛应用于倒排索引...
如何实现 Elasticsearch 集群的滚动升级?回答重点实现 Elasticsearch 集群的滚动升级的步骤如下:
1)准备升级:首先,要确保你已经备份了数据,并阅读了相关版本的升级指南,以便了解特定版本间的变化和升级要求。
2)禁用 shard 分配:通过执行API请求禁用 shard 分配,以防止因为节点的重启导致 rebalancing 和数据重新分配的开销。 123456...
Elasticsearch 中的 Fielddata 是什么?如何优化其性能?回答重点Elasticsearch 中的 Fielddata 是一种在对非文本字段进行排序、聚合或脚本操作时,Elasticsearch 会将字段的值从磁盘加载到内存中的机制。Fielddata 的目的是提供快速的查询和操作体验。但是,由于它需要将大量数据加载到内存中,因此很可能会带来性能问题,特别是在处理大规模数...
如何使用 Elasticsearch 实现机器学习模型的推理?回答重点可以使用 Elasticsearch 内置的机器学习功能实现学习模型的推理。这些功能支持模型的训练、评估以及推理。具体步骤如下:
1)准备数据:确保你的数据已经被索引到 Elasticsearch 中,数据格式应符合模型训练的要求。2)创建并训练模型:使用 Elasticsearch 的机器学习 API,如数据帧分析(Da...
如何通过 Elasticsearch 实现分布式事务?回答重点Elasticsearch 本身并不直接支持分布式事务,这是因为它不是一个关系型数据库,主要用于全文搜索和分析。它设计的核心原则是分布式和最终一致性。在这种架构下,它无法提供关系型数据库那样的事务支持(_ACID_)。因此,如果要用 Elasticsearch 实现分布式事务,我们需要借助其他工具和架构,例如使用消息队列、双写架构...
如何在 Elasticsearch 中设计和实现数据的多层次缓存机制?回答重点1)采集访问模式:首先了解和分析数据访问的模式,确定哪些类型的数据访问频率高,哪些数据可以通过缓存来优化。
2)利用 Elasticsearch 自带缓存功能:Elasticsearch 具有查询缓存、节点缓存等内置缓存,可以通过调整配置进行优化。例如,通过调整查询缓存(query cache)的大小和生命周期,可...
Java 线程池内部任务出异常后,如何知道是哪个线程出了异常?重点回答默认情况下,线程池不会直接报告哪个线程发生了异常,但是可以采取以下几种方法:
1)**自定义线程池的 ThreadFactory**:
通过自定义 ThreadFactory,为每个线程设置一个异常处理器(UncaughtExceptionHandler),在其中记录发生异常的线程信息。
2)**使用 Future**...
Java 线程池中 shutdown 与 shutdownNow 的区别是什么?重点回答shutdown() 和 shutdownNow() 都用于关闭线程池,但工作方式有所不同:
1)**shutdown()**:
启动线程池的平滑关闭。它不再接受新的任务,但会继续执行已经提交的任务(包括在队列中的任务)。
线程池会进入 SHUTDOWN 状态,所有已执行和正在执行的任务都会继续完成,只有...
Java 中 Thread.sleep 和 Thread.yield 的区别?回答重点Thread.sleep() 和 Thread.yield() 都是用于控制线程行为的两个方法。
**Thread.sleep()**:
使当前线程进入休眠状态(TIMED_WAITING 状态),暂停执行指定的时间(以毫秒为单位)。在休眠期间,线程不会占用 CPU 时间片。休眠结束后,线程会尝试重新获取...
Java 中如何创建多线程?回答重点常见有以下五种方式创建使用多线程:
1)实现 Runnable 接口:
实现 Runnable 接口的 run() 方法,使用 Thread 类的构造函数传入 Runnable 对象,调用 start() 方法启动线程。
例子:Thread thread = new Thread(new MyRunnable()); thread.start();
2...
Java 线程池核心线程数在运行过程中能修改吗?如何修改?回答重点可以动态修改的。Java 的 ThreadPoolExecutor 提供了动态调整核心线程数和最大线程数的方法。
1)修改核心线程数的方法:
使用 ThreadPoolExecutor.setCorePoolSize(int corePoolSize) 方法可以动态修改核心线程数。corePoolSize 参数代表线程池中的...
什么是 Java 中的线程同步?回答重点线程同步是指在多线程环境下,为了避免多个线程对共享资源进行同时访问,从而引发数据不一致或其他问题的一种机制。它通过对关键代码段加锁,使得同一时刻只有一个线程能够访问共享资源。
当多个线程共享同一资源(如变量、对象或文件)时,若没有同步机制,可能会导致竞态条件,即线程对共享资源的操作是非原子性的,多个线程之间可能会同时修改数据,导致结果不符合预期。
扩展...
在 Java 中主线程如何知晓创建的子线程是否执行成功?回答重点1)**使用 Thread.join()**:
主线程通过调用 join() 方法等待子线程执行完毕。子线程正常结束,说明执行成功,若抛出异常则需要捕获处理。
2)**使用 Callable 和 Future**:
通过 Callable 创建可返回结果的任务,并通过 Future.get() 获取子线程的执行结果或捕获异...
详细描述一条 SQL 语句在 MySQL 中的执行过程。回答重点
先通过连接器校验权限
利用分析器进行 SQL 语句的词法分析和语法分析,构建解析树
使用优化器选择合适的索引和表连接顺序,最终选择一个最佳的执行计划
利用执行器,调用引擎层查询数据,返回结果集给客户端
扩展知识详细流程分析我们以一条查询 SQL 为例:select * from user where id=1;
在...
MySQL 的索引类型有哪些?回答重点从数据结构角度来看,MySQL 索引可以分为以下几类:
B+树索引
哈希索引
倒排索引(即全文索引 Full-Text)
R-树索引(多维空间树)
从常见的基于 InnoDB B+ 树索引角度来看,可以分为:
聚簇索引(Clustered Index)
非聚簇索引(Non-clustered Index)
从索引性质的角度来看,可以分为:
普通...
MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?回答重点聚簇索引:
索引叶子结点存储的是数据行,可以直接访问完整数据。
每个表只能有一个聚簇索引,通常是主键索引,适合范围查询和排序。
非聚簇索引:
索引叶子节点存储的是数据行的主键和对应的索引列,需通过主键才能访问完整的数据行。
一个表可以有多个非聚簇索引(称之为非主键索引、辅助索引、二级索引),适用于快速查找特定列的...
MySQL 的存储引擎有哪些?它们之间有什么区别?回答重点MySQL 的主要存储引擎包括:
1)InnoDB(重点):
支持事务、行级锁和外键。
提供高并发性能,适用于高负载的 OLTP 应用。
数据以聚集索引的方式存储,提高检索效率。
2)MyISAM(重点):
不支持事务和外键,使用表级锁。
适合读取多、更新少的场景,如数据仓库。
具有较高的读性能和较快的表级锁定。
3)MEMO...
MySQL 中的回表是什么?回答重点“回表” 是指在使用二级索引(非聚簇索引)作为条件进行查询时,由于二级索引中只存储了索引字段的值和对应的主键值,无法得到其它数据。如果要查询数据行中的其它数据,需要根据主键去聚簇索引查找实际的数据行,这个过程被称为回表。
扩展知识进一步理解回表举个例子:select * from user where age = 20;(user 包含 name、age、...
MySQL 的覆盖索引是什么?回答重点MySQL 的覆盖索引(Covering Index)是指二级索引中包含了查询所需的所有字段,从而使查询可以仅通过访问二级索引而不需要访问实际的表数据(主键索引)。
扩展知识覆盖索引的优点
减少I/O操作:因为查询可以直接从索引中获取所有需要的数据,避免了访问实际表的数据页,从而减少了I/O操作。
提高查询速度:索引比表数据更紧凑,因...
MySQL 索引的最左前缀匹配原则是什么?回答重点MySQL 索引的最左前缀匹配原则指的是在使用联合索引时,查询条件必须从索引的最左侧开始匹配。如果一个联合索引包含多个列,查询条件必须包含第一个列的条件,然后是第二个列,以此类推。
底层原理:因为联合索引在 B+ 树中的排列方式遵循“从左到右”的顺序,例如联合索引 (first_name, last_name, age) 会按照 (first...
MySQL 的索引下推是什么?回答重点索引下推(Index Condition Pushdown, ICP)是一种减少回表查询,提高查询效率的技术。它允许 MySQL 在使用索引查找数据时,将部分查询条件下推到存储引擎层过滤,从而减少需要从表中读取的数据行,减少了 IO(本该由 Server 层做操作,交由存储引擎层因此叫做 “下推” ) 。
注意:索引下推是应用在联合索引上的。
扩展知识官...
在 MySQL 中建索引时需要注意哪些事项?回答重点简单总结了以下六点:
1)不能盲目建立索引,索引并不是越多越好,索引会占用空间,且每次修改的时候可能都需要维护索引的数据,消耗资源。
2)对于字段的值有大量重复的不要建立索引。比如说:性别字段,在这种重复比例很大的数据行中,建立索引也不能提高检索速度。但是也不绝对,例如定时任务的场景,大部分任务都是成功,少部分任务状态是失败的,这时候通过失...
MySQL 中的索引数量是否越多越好?为什么?回答重点索引并不是越多越好。因为索引不论从时间还是空间上都是有一定成本的
1)从时间上
每次对表中的数据进行增删改(INSERT、UPDATE 或 DELETE)的时候,索引也必须被更新,这会增加写入操作的开销。例如删除了一个 name 为面试鸭的记录,不仅主键索引上需要修改,如果 name 字段有索引,那么 name 索引也需要修改,所以索引越...
请详细描述 MySQL 的 B+ 树中查询数据的全过程回答重点1)数据从根节点找起,根据比较数据键值与节点中存储的索引键值,确定数据落在哪个区间,从而确定分支,从上到下最终定位到叶子节点2)叶子节点存储实际的数据行记录,但是一页有 16kb 大小,存储的数据行不止一条3)叶子节点中数据行以组的形式划分,利用页目录结构,通过二分查找可以定位到对应的组4)定位组后,利用链表遍历就可以找到对应的数...