JAVA面试常见面试问题01

1、队列系列

1.1、选型

ActiveMq ⼩规模场景,有较低概率丢失消息,官方社区维护少
RabbitMq ⼩规模场景,吞吐量⽐较低,消息积累会严重影响性能
RocketMQ ⼩规模场景,官⽅⽂档和周边⽣态还不够成熟
Kafka 大规模场景,⽇志分析、⼤数据采集、大数据实时计算

1.2、所有队列都是用来解耦和流量削峰从而实现异步处理

1.3、rabbitmq

Broker服务节点、生产者Publisher、消费者Consumer、Exchange:交换器

传输模式简单模式  1个生产者  1个消费者 1个队列

                  工作模式  1个生产者  2个消费者  1个队列

                  发布/订阅模式 点对点的key 发和接收 无限制生产者消费者

                  路由模式 1个生产者 2个消费者 2个队列 1个交换机,2个消费者同时绑定到不同队                          列,2个队列绑定到不同交换机,生产者发送消息到交换机,交换机转到消费者并消费

分发策略:轮询分发、不公平分发、预值分发

消息堆积:分析是否bug导致,如果不是则扩容

持久化:RabbitMQ 消息默认存在内存,不声明则不保存到硬盘,如果节点挂了消息会丢失,声明                在配置参数

              非必要消息无需持久化,在硬盘中效率低于内存

应答机制:自动应答 高吞吐下内存耗尽可能会失效。手动应答 可以写在try catch内 确定和否认

事务: 通过AMQP事务机制实现、通过将channel设置成confirm模式来实现

1.3、kafka

以前的版本需要装ZooKeeper 用于协调;新版本内置zk;

关键字: Producer、Broker、Consumer、Consumer Group、Topic、分区、副本

2、多线程

ab 两个线程,a线程怎么访问到b线程

答: 通过共享对象通信、忙等待

3、redis雪崩

redis缓存中大量的key同时失效,此时又刚好有大量的请求打进来,直接打到数据库层,造成数据库阻塞甚至宕机。

解决办法

事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。
原有的失效时间基础上增加一个随机值,比如1-5分钟随机
加锁,当出现缓存失效的情况通过锁控制一定时间只有一个线程获取到资源从数据库拿到数据后写回缓存,后面基于缓存做查询
缓存预热
热点key设置永不过期。
事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。
事后:Redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

4、springboot 装配

4.1、初始化监听器:通过getrunlistners方法负责在启动的不同阶段,传播不同的信息给监听实体类。

4.2、构建上下文环境:通过preparenvironment方法对java环境和配置文件加载封装

4.3、初始化应用上下文:通过creatapplication方法创建上下文对象构建ioc容器

4.4、刷新上下文准备阶段: 通过preparecontext方法为前面的上下文对象设置属性,并完成一些bean对象创建包括启动类。

4.5、刷新上下文即自动装配

4.5.1、自动装配由启动类的springbootapplication注解实现,主要包括springbootconfiguration,enableautoconfiguration,componentscan注解。

4.5.2、springbootconfiguration注解包括:configuration和conponent注解

4.5.3、componscan:实现扫描功能

4.5.4、enableautoconfiguration:包含一个autoconfigurationpackge然后里面包含一个import注解传入registart.class类构建一个注册器。

4.5.5、enableautoconfiguration:还包含一个import注解,传入autoconfigurationimportselector.class类。会调用该类的getautoconfigurationentry方法即获取所有的候选配置类。然后调用getcandidateconfigurations方法即获取所有的候选配置。然后调用getspringfactoriesloaderfactoryclass方法,即获取标注了enableconfiguration注解的类即启动类。

4.5.6、getcandidateconfigurations:该方法去调用loadfactoryName方法,获取所有的加载配置,调用loadspringfactories方法,调用classloader.getresource和classloader.getsystemresource方法,会去找到meta-info-spring.factories文件,将里面的资源遍历封装成properties文件供我们使用
 

5、mysql

索引

5.1、按数据结构分类: B+Tree 索引、HASH 索引、Full-Text 索引

5.2、按物理存储分类:聚簇索引(主键索引)、二级索引(辅助索引)

5.3、按字段特性分类:主键索引、唯一索引、普通索引、前缀索引

5.4、按字段个数分类:单列索引、联合索引

关键字

explain 查询调用索引情况、分析慢查询
show profile 分析慢查询
show processlist 查看正在执行的慢查询

6、redis数据类型

  • String(字符串)
  • Hash(哈希)
  • List(列表)
  • Set(集合)
  • zset(有序集合)
  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值