- 多线程,线程池,JVM ,GC
- MySQL 索引
- linux输入输出 重定向命令
- lambda表达式介绍
- mysql的引擎类型及区别
- MySQL 的索引创建过程 出现大数据查询比较慢时怎么排查
- 多系统之间依赖包有依赖冲突怎么解决
- http常用返回码
- restfulApi知识
- 如何保证微服务间高可用
- springmvc和spring的区别
- Springboot 和Spring 之间的区别理解
- 内存泄露是怎么发生的,可以怎么修复
- java中锁 内存泄漏
- jdk8 的lambda表达式
- 集合、数据列表 数据结构和算法
- 面向对象了解,熟悉封装、集成、多态
- 熔断和限流的区别
- 网关的作用
- 两个服务器间调用,如果别人说你的接口慢,怎么优化
- http请求的转发和重定向区别
- fegin和http请求的区别
- Spring Bean 的作用域
- 查询数据量比较大的数据表,怎么优化
- JUC 包里面的 工具类,线程安全实现原理
- ThreadLocal 如何实现线程隔离
- 说一说你比较熟悉的设计模式
- 怎么创建线程
- java竞争资源的锁机制
- 多线程编程 安全处理 线程池
- ConcurrentHashMap 和 CopyOnWriteArrayList 异同
- ConcurrentHashMap 线程安全的原理,CAS的安全机制
- ReentrantLock 和 synchronized 相关原理
- kafka 和MQ 的区别
- kafka 如何避免重复消费
- 微服务熔断,限流
- Redis 缓存雪崩
- 乐观锁 怎么实现公平锁
- 垃圾回收器用的啥
多线程,线程池,JVM ,GC
MySQL 索引
MySQL存储引擎:InnoDB, MyISAM, Memory, NDB等
以InnoDB存储引擎为例:
InnoDB存储引擎只支持BTree类型的索引。索引类型有Primary Key, Unique, Key, FULLTEXT和SPATIAL。按照索引列的数量分为单列索引和组合索引。
- Primary Key(聚集索引):InnoDB存储引擎的表会存在主键(唯一非null),如果建表的时候没有指定主键,则会使用第一非空的唯一索引作为聚集索引,否则InnoDB会自动帮你创建一个不可见的、长度为6字节的row_id用来作为聚集索引。
- 单列索引:单列索引即一个索引只包含单个列
- 组合索引:组合索引指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引时遵循最左前缀集合
- Unique(唯一索引):索引列的值必须唯一,但允许有空值。若是组合索引,则列值的组合必须唯一。主键索引是一种特殊的唯一索引,不允许有空值
- Key(普通索引):是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值
- FULLTEXT(全文索引):全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。全文索引可以在CHAR、VARCHAR或者TEXT类型的列上创建
- SPATIAL(空间索引):空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING和POLYGON。MySQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类似的语法创建空间索引。创建空间索引的列必须声明为NOT NULL
linux输入输出 重定向命令
lambda表达式介绍
mysql的引擎类型及区别
MySQL 的索引创建过程 出现大数据查询比较慢时怎么排查
多系统之间依赖包有依赖冲突怎么解决
什么是依赖冲突?
依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突。
依赖冲突的原因?
依赖冲突很经常是类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,从而造成类包冲突。
如何解决依赖冲突?
首先查看产生依赖冲突的类jar,其次找出我们不想要的依赖类jar,手工将其排除在外就可以了。
- 查看依赖冲突
a. 通过dependency:tree命令来检查版本冲突mvn -Dverbose dependency:tree
其中omitted for duplicate表示有jar包被重复依赖,最后写着omitted for conflict with xxx的,说明和别的jar包版本冲突了,而该行的jar包不会被引入。
b. 如果使用idea,可以安装maven helper插件来检查依赖冲突
- 解决冲突
a. 使用第一声明者优先原则
谁先定义的就用谁的传递依赖,即在pom.xml文件自上而下,先声明的jar坐标,就先引用该jar的传递依赖。
b. 使用路径近者优先原则
即直接依赖级别高于传递依赖。
c. 排除依赖
如果使用idea,可以使用maven helper插件进行排除。
d. 版本锁定
使用dependencyManagement进行版本锁定,dependencyManagement可以统一管理项目的版本号,确保应用的各个项目的依赖和版本一致。
http常用返回码
restfulApi知识
如何保证微服务间高可用
springmvc和spring的区别
Springboot 和Spring 之间的区别理解
内存泄露是怎么发生的,可以怎么修复
java中锁 内存泄漏
jdk8 的lambda表达式
集合、数据列表 数据结构和算法
面向对象了解,熟悉封装、集成、多态
熔断和限流的区别
- 熔断的目的是应对外部系统的故障,而降级是应对系统自身的故障。
- 实现思路:需要系统有一个统一的API调用层,由API来进行采样或者统计。
- 限流,只允许系统能够承受的访问量进来,超出的会被丢弃。降级从系统功能优先级角度考虑如何应对故障,而限流则从用户访问压力的角度来考虑如何应对故障。
常见限流方式:
- 基于请求限流:指从外部请求的角度考虑限流。
- 基于资源限流:指从系统内部考虑,找到影响性能的关键资源,对其使用上限限制。
网关的作用
微服务网关是整个微服务API请求的入口,可以实现过滤Api接口。
作用:可以实现用户的验证登录、解决跨域、日志拦截、权限控制、限流、熔断、负载均衡、黑名单与白名单机制等。
过滤器与网关的区别
过滤器适合于单个服务实现过滤请求;
网关拦截整个的微服务实现过滤请求,能够解决整个微服务中冗余代码。
过滤器是局部拦截,网关实现全局拦截。
两个服务器间调用,如果别人说你的接口慢,怎么优化
http请求的转发和重定向区别
fegin和http请求的区别
Spring Bean 的作用域
查询数据量比较大的数据表,怎么优化
JUC 包里面的 工具类,线程安全实现原理
ThreadLocal 如何实现线程隔离
说一说你比较熟悉的设计模式
怎么创建线程
java竞争资源的锁机制
多线程编程 安全处理 线程池
ConcurrentHashMap 和 CopyOnWriteArrayList 异同
ConcurrentHashMap 线程安全的原理,CAS的安全机制
ReentrantLock 和 synchronized 相关原理
kafka 和MQ 的区别
实际场景选择
在实际生产应用中,通常会使用kafka作为消息传输的数据管道,rabbitmq作为交易数据作为数据传输管道,主要的取舍因素则是是否存在丢数据的可能;rabbitmq在金融场景中经常使用,具有较高的严谨性,数据丢失的可能性更小,同事具备更高的实时性;而kafka优势主要体现在吞吐量上,虽然可以通过策略实现数据不丢失,但从严谨性角度来讲,大不如rabbitmq;而且由于kafka保证每条消息最少送达一次,有较小的概率会出现数据重复发送的情况;
- 应用场景方面
RabbitMQ:用于实时的,对可靠性要求较高的消息传递上。
kafka:用于处于活跃的流式数据,大数据量的数据处理上。
- 架构模型方面
producer,broker,consumer
RabbitMQ:以broker为中心,有消息的确认机制
kafka:以consumer为中心,无消息的确认机制
- 吞吐量方面
RabbitMQ:支持消息的可靠的传递,支持事务,不支持批量操作,基于存储的可靠性的要求存储可以采用内存或硬盘,吞吐量小。
kafka:内部采用消息的批量处理,数据的存储和获取是本地磁盘顺序批量操作,消息处理的效率高,吞吐量高。
- 集群负载均衡方面
RabbitMQ:本身不支持负载均衡,需要loadbalancer的支持
kafka:采用zookeeper对集群中的broker,consumer进行管理,可以注册topic到zookeeper上,通过zookeeper的协调机制,producer保存对应的topic的broker信息,可以随机或者轮询发送到broker上,producer可以基于语义指定分片,消息发送到broker的某个分片上。
- RabbitMQ的消息应当尽可能的小,并且只用来处理实时且要高可靠性的消息。
- 消费者和生产者的能力尽量对等,否则消息堆积会严重影响RabbitMQ的性能。
集群部署,使用热备,保证消息的可靠性。
应当有一个非常好的运维监控系统,不单单要监控Kafka本身,还要监控Zookeeper。(kafka强烈的依赖于zookeeper,如果zookeeper挂掉了,那么Kafka也不行了)
- 对消息顺序不依赖,且不是那么实时的系统。
- 对消息丢失并不那么敏感的系统。
- 从 A 到 B 的流传输,无需复杂的路由,最大吞吐量可达每秒 100k 以上。
kafka 如何避免重复消费
微服务熔断,限流
Redis 缓存雪崩
缓存雪崩表示在某一时间段,缓存集中失效,导致请求全部走数据库,有可能搞垮数据库,使整个服务瘫痪。
使缓存集中失效的原因:
1、redis服务器挂掉了。
2、对缓存数据设置了相同的过期时间,导致某时间段内缓存集中失效。
如何解决缓存集中失效:
1、针对原因1,可以实现redis的高可用,Redis Cluster 或者 Redis Sentinel(哨兵) 等方案。
2、针对原因2,设置缓存过期时间时加上一个随机值,避免缓存在同一时间过期。
缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
缓存击穿:key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
乐观锁 怎么实现公平锁
垃圾回收器用的啥
CMS和G1