这个面试吧,朋友推荐的 ,问的很简单 ,但是表现的不好o(╥﹏╥)o
- 线程池有哪些
FixedThreadPool(固定大小线程池) :FixedThreadPool 是一个固定大小的线程池,该线程池中的线程数量始终保持不变。当有新任务提交时,如果线程池中有空闲线程,则立即执行;如果没有空闲线程,则任务会进入队列等待执行。
CachedThreadPool(缓存线程池) :CachedThreadPool 是一个可以动态调整线程数量的线程池,适用于执行大量、短时间的异步任务。当有新任务提交时,如果线程池中有空闲线程,则复用空闲线程执行任务;如果没有空闲线程,则创建新线程执行任务。线程在空闲一定时间后会被回收。
SingleThreadExecutor(单线程线程池) :SingleThreadExecutor 是一个只有单个工作线程的线程池,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。适用于需要顺序执行任务的场景。
ScheduledThreadPool(定时任务线程池) :ScheduledThreadPool 是一个支持定时和周期性任务执行的线程池。可以设定延迟时间或周期性执行任务。
WorkStealingPool(工作窃取线程池) :WorkStealingPool 是 Java 7 引入的一种线程池实现,基于 ForkJoinPool 实现。该线程池采用工作窃取算法,可以提高并行任务处理的效率。
-
业务中多线程场景
-
redis持久化
rdb aof
- redis消息过期处理和消息淘汰机制
定时删除 惰性删除(查询的时候发现过期才删掉)
LRU 删除最近一段时间内的不常使用的数据
LFU 删除很长一段时间内不常使用的数据
- rabbitmq 死信队列
死信队列(Dead Letter Queue,DLQ)是消息中间件中的一种特殊队列,用于处理无法被消费的消息。当消息无法被正常消费时,消息中间件会将这些消息发送到死信队列中,以便后续进行处理或分析。
以下是死信队列的一些关键特点和用途:
- 处理异常消息:死信队列用于处理消费者无法处理的异常消息,比如消息格式错误、消费失败、超时等情况。
- 重试机制:通过死信队列,可以实现消息的重试机制。消费者在处理消息失败后,可以将消息重新发送到队列,让其进入死信队列,再由专门的处理程序进行检查和处理。
- 延迟处理:死信队列也可以用于延迟处理某些消息。例如,可以设置消息在一定时间内未被处理时,自动进入死信队列,供后续处理。
- 监控与分析:死信队列中的消息可以提供有关系统运行状况和异常情况的数据,用于监控和分析系统性能以及故障排查。
- 资源释放:对于长时间未被消费的消息,如果没有合适的处理方式,可以将其发送到死信队列,并释放资源,避免消息堆积导致系统性能下降。
死信队列在分布式系统和消息队列系统中具有重要作用,能够提高系统的稳定性和可靠性。通过合理配置和管理死信队列,可以有效处理异常情况,保证系统正常运行。
- rabbitmq 消息分发机制
简单模式(一对一)
生产者将消息放入队列,消费者(consumer) 监听 消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除(隐患 消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失,这里可以设置成手动的ack,但如果设置成手动ack,处理完后要及时发送ack消息给队列,否则会造成内存溢出)工作模式(一对多)
消息产生者将消息放入队列消费者可以有多个,消费者1,消费者2同时监听同一个队列,消息被消费。C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息(隐患:高并发情况下,默认会产生某一个消息被多个消费者共同使用,可以设置一个开关(syncronize) 保证一条消息只能被一个消费者使用)。发布订阅
- 每个消费者监听自己的队列;
- 生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息。
路由模式
- 消息生产者将消息发送给交换机按照路由判断,路由是字符串(info) 当前产生的消息携带路由字符(对象的方法),交换机根据路由的key,只能匹配上路由key对应的消息队列,对应的消费者才能消费消息;
- 根据业务功能定义路由字符串
- 从系统的代码逻辑中获取对应的功能字符串,将消息任务扔到对应的队列中。
- 业务场景:error 通知;EXCEPTION;错误通知的功能;传统意义的错误通知;客户通知;利用key路由,可以将程序中的错误封装成消息传入到消息队列中,开发者可以自定义消费者,实时接收错误;
主题模式(路由模式的一种)
就是routing查询的一种模糊匹配,就类似sql的模糊查询方式
- mysql索引失效
or、like % 、!=等等
- mysql索引为什么快
避免了全表扫描、快速定位数据
底层方面
- B-Tree 索引结构:MySQL 中使用最广泛的索引类型是 B-Tree(平衡树)索引。B-Tree 索引是一种多路搜索树,它可以保持数据有序并快速定位到目标记录。通过不断分裂和合并节点,B-Tree 索引可以保持树的平衡,使得每个节点包含的关键字数量在一个范围内,从而保证检索效率较高。
- 聚集索引:在 InnoDB 存储引擎中,表的主键索引被称为聚集索引。聚集索引的叶子节点保存了数据行的实际数据,因此可以直接通过主键索引定位到数据行,减少了额外的查找步骤,提高查询效率。
- 覆盖索引:当查询的字段在索引中完全包含了查询需要的字段时,MySQL 可以直接从索引中获取数据,而不需要再访问数据表,这种情况称为覆盖索引。覆盖索引可以减少磁盘 I/O 和内存消耗,提高查询性能。
- 索引范围扫描:对于范围查询(如 BETWEEN、>、<),MySQL 可以利用索引的有序性,在索引树上进行范围扫描,快速定位符合条件的数据,避免全表扫描,提高查询效率。
- 最左前缀匹配:MySQL 的 B-Tree 索引可以按照索引的顺序进行匹配,因此在使用复合索引时,可以利用最左前缀匹配原则,只要查询条件中包含索引的最左前缀列,即可使用索引加速查询。