目录
Spring,Spring MVC,Spring Boot 之间什么关系
JPA、Hibernate、SpringData JPA的关系
在 hibernate 中 getCurrentSession 和 openSession 的区别
Spring
Spring 框架概念
Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性
Spring 常见模块及其作用
- Spring Core:核心模块, Spring 其他所有的功能基本都需要依赖于该模块,主要提供依赖注入(DI)功能的支持
- Spring Aspects:该模块为与切面的集成提供支持
- Spring AOP:提供了面向切面的编程实现,类似 Aspects 的一个简化的 AOP 方案实现
- Spring Data:五个模块,提供了对数据库和消息服务的支持
- Spring Web:提供了对 web 的支持
- Spring Test:提供了对测试的支持
Spring,Spring MVC,Spring Boot 之间什么关系
- Spring MVC 是 Spring 的一个确保 MVC 功能的重要模块
- Spring Boot 是对 Spring 配置的一种开箱即用,直接省略了大部分的 XML 或 Java 配置
IoC 概念
- 控制反转:一种设计思想,将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理(并非 Spring 特有)
- 容器:IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个 Map(Map 中存放的是各种对象)
- DI:依赖注入,组件之间依赖关系由容器在运行期决定
AOP 概念
- 面向切面编程:为业务模块所共同调用公共模块封装起来,降耦合、减重复、利扩展(事务处理、日志管理、权限控制)
- 基于动态代理:代理的对象实现了接口,则使用 JDK 动态代理,否则使用 Cglib 生成被代理对象的字类进行代理
Spring AOP 和 AspectJ AOP 的区别
- Spring AOP 属于运行时增强(基于代理),而 AspectJ 是编译时增强(基于字节码操作)
- Spring AOP 是 AspectJ 的一种简单集成,实现了 AspectJ 部分重要功能,少量切面两者效率相等,大量切面效率低于 AspectJ
Bean 概念
Bean 代指的就是那些被 IoC 容器所管理的对象
声明为 Bean 的注解有哪些
@Component
:通用的注解,可标注任意类为Spring
组件。如果一个 Bean 不知道属于哪个层,可以使用@Component
注解标注@Repository
: 对应持久层接口,使得其生成代理对象bean,主要用于数据库相关操作,需要配合@MapperScan 才能被扫描到- @Mapping:mybatis 特有注解,对应持久层接口,使得其生成代理对象bean,不一定需要 @MapperScan 扫描,如果使用则可以省去 @Mapping 注解
@Service
: 对应 Service 层,主要涉及一些复杂的逻辑,需要用到 Dao 层@Controller
: 对应 Controller 层,主要用户接受用户请求并调用 Service 层返回数据给前端页面- @Bean:作用于方法
注入 Bean 的注解有哪些
- @Autowired:基于类型查找注入 Bean(Spring 内置)
- @Resource:基于名称查找注入 Bean(JDK 内置)
- @Inject:基于名称查找注入 Bean(JDK 内置)
Bean 的作用域有哪些
- singleton 单例:唯一 bean 实例,对单例设计模式的应用
- prototype 多例:每次请求都会创建一个新的 bean 实例
- request 请求:每一次请求都会产生一个新的 bean 实例,仅在当前请求内有效
- session 会话:每一次来自新 session 绘画的请求都会产生一个新的 bean,仅在当前 session 会话内有效
- global-session 全局:全局 session 作用域,Spring5 已废弃
Bean 的生命周期
- 对bean进行实例化
- 填充属性
- 执行一系列的方法构建bean的名称、工厂等
- 注入bean使用
- 销毁bean
Spring MVC 概念
- MVC 是模型(Model)、视图(View)、控制器(Controller)的简写
- MVC 将业务逻辑、数据、显示分离来组织代码,提高代码的可读性、扩展性
Spring Mvc流程
- 前端控制器:捕获请求,转发到处理映射器
- 处理映射器:解析请求找到指定处理器(controller)
- 处理器:处理具体业务逻辑(method)
- 视图解析器:将处理结果生成 View 视图
- 前端:解析视图渲染
Spring 框架中用到的设计模式
- 工厂设计模式 :
BeanFactory
、ApplicationContext
创建 bean 对象 - 代理设计模式 : AOP 功能的实现
- 单例设计模式 : Bean 默认都是单例的
- 模板方法模式 : 以 Template 结尾的对数据库操作的类(
jdbcTemplate
、hibernateTemplate
) - 观察者模式: 事件驱动模型就是观察者模式很经典的一个应用
- 适配器模式 : AOP 的增强或通知(Advice)、spring MVC 中也是用到了适配器模式适配
Controller
Spring 管理事务种类
- 编程式事务 :通过
TransactionTemplate
或者TransactionManager
手动管理事务 - 声明式事务 :通过 XML 或注解配置,基于 AOP 实现事务管理
Spring 事务传播方式
required-默认事务 |
|
supports-事务继承 |
|
mandatory-无事务异常 |
|
required_new-新建事务 |
|
not_supported-非事务运行 |
|
never-有事务异常 |
|
nested-嵌套事务 |
|
Spring 事务隔离级别
(isolation_default) | 使用后端数据库默认的隔离级别(Sql Server , Oracle。MySQL的默认隔离级别是 可重复读) |
(isolation_ read_uncommitted) | 未提交读:级别最低,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读 |
(isolation_ read_committed) | 提交读:只能读取其他事务提交的数据,避免未提交读的脏读问题 但是幻读或不可重复读仍有可能发生(没有对数据进行锁定) |
(isolation_ repeatable_read) | 可重复读:对同一字段的多次读取结果是一致的,除非是被本身事务自己所修改,可以阻止脏读和不可重复读(锁定了指定数据) 幻读仍有可能发生(表能添加数据就会导致范围查询的数据结果不一致) |
(isolation_ serializable) | 序列化锁定:完全服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读,也是最慢的事务隔离级别 通常是通过完全锁定事务相关的数据库表来实现的 |
事务特性
- 原子性(Atomicity):不可分割
- 一致性(Consistency):要么都成功,要么都失败
- 隔离型(Isolation):一个事务的执行不能被其它事务干扰
- 持久性(Durability):指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的
锁的类型
-
可重入锁:获取指定对象的锁后,还可以继续获取该对象的锁(调用该对象的另一个同步块(方法)),否则会发生死锁现象
-
可中断锁:长时间等待别的线程释放指定锁时自动放弃等待(Lock),synchronized 不能
-
公平锁:多线程时线程获取锁的顺序是按照请求锁的顺序来的,(不是完全公平,ReentrantLock、ReadWriteLock可设置为公平锁)
-
非公平锁:多线程时线程获取锁的顺序不是固定的,可能有的线程永远获得不到锁(synchronized)
-
乐观锁:修改某条数据提交更新时,才会正式对数据的冲突与否进行检测,冲突则返回给用户错误的信息(版本号控制并发时用到)
-
悲观锁:要修改某条数据时,直接加锁防止并发(synchronized、Lock)
-
排他锁:保证同一时刻只能有一个线程获取锁(synchronized、lock写锁)
-
共享锁:同一时刻可以有多个线程获取锁(ReadWriteLock 读锁)
实现锁的方式
- synchronized:通过进入、退出 对象监视器(Monitor) 来实现对方法、同步块的同步(具体实现是在编译之后在同步方法调用前加入一个 monitor.enter 指令,在退出方法和异常处插入 monitor.exit 的指令)
- reentrantLock:Lock 实现类,基于 AQS (通过 CAS 修改 AQS 内部的变量 state 修改成功则加锁成功,否则通过 Waiter 对象封装线程添加到等待队列里面挂起、等待)实现,AQS 的基础又是 CAS(CAS 是通过 unsafel 类里面的compareAndSwap 方法实现的)
SpringBoot 自动装配概念
- 通过注解或者一些简单的配置就能在 Spring Boot 的帮助下实现某块功能
- SpringBoot 的装配规范:在启动时会扫描外部引用 jar 包中的
META-INF/spring.factories
文件,会将文件中按照指定规范编写配置的类型信息加载到 Spring 容器,并执行类中定义的各种操作
SpringBoot 自动装配原理
- @SpringBootApplication:包含 @Configuration、@ComponentScan、@EnableAutoConfiguration 三个注解,最后一个尤为关键
- @EnableAutoConfiguration:注解中的 AutoConfigurationImportSelector 类实现了 ImportSelector接口,该接口主要用于获取所有符合条件的类的全限定类名,这些类需要被加载到 IoC 容器中
- ImportSelector 接口实现类,首先会判断是否开启了自动装配,然后解析注解中的排除项,最后读取 META-INF/spring.factories 文件
MyBatis 面试题
#{}和${}的区别是什么
#{}:
是 sql 的参数占位符,MyBatis 会将 sql 中的#{}
替换为? 号,然后按序设置指定值${}:
是 Properties 文件中的变量占位符,属于静态文本替换(${driver}——>com.mysql.jdbc. Driver
)
分页实现方式
- 内存分页:Mybatis 借助 RowBounds 对象进行结果集分页
- 物理分页:直接在 Sql 中指定分页参数
- 插件分页:通过 Mybatis 提供的插件接口实现自定义分页插件,拦截 Sql语句拼接分页参数
插件实现原理
MyBatis 使用 JDK 的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能
如何自定义插件
- 首先实现 MyBatis 的 Interceptor 接口并复写
intercept()
方法 - 然后给插件编写注解,指定要拦截哪一个接口的哪些方法即可
- 最后在配置文件中配置编写的插件
MyBatis 延迟加载原理(按需加载)
- 延迟加载只存在于数据表的级联查询中,单表查询没有延迟加载的功能
- 调用时触发加载,而非初始化时就加载信息(调用对象属性值为 null 时会进入关联的 xml 文件中执行 sql 获取值并放进对象中)
Mybatis 与 Hibernate 的区别
- Hibernate 属于全自动 ORM 映射工具,而 MyBatis 需要手写 Sql 查询关联对象或者关联集合对象
- hibernate对象/关系映射能力强,数据库无关系好
xml 文件和 mybatis 内部数据结构映射关系
- 所有 Xml 配置信息都封装到重量级对象 Configuration 内部
- < parameterMap> 标签会被解析为ParameterMap 对象,其每个子元素会被解析为ParameterMapping对象
- < resultMap>标签会被解析为ResultMap对象,其每个子元素会被解析为ResultMapping对象
- < select>、< insert>、< update>、< delete>标签均会被解析为MappedStatement 对象,标签内的sql会被解析为BoundSql对象
JPA
JPA、Hibernate、SpringData JPA的关系
- JPA 是一套规范,内部是由接口和抽象类组成的
- Hibernate 是一套实现了 JPA 规范的成熟ORM框架
- SpringData JPA 是 Spring 提供的一套对 JPA 操作更加高级的封装,是在 JPA 规范下的专门用来进行数据持久化的解决方案
Hibernate
Hibernate特点
- hibernate 是对 jdbc 的封装:大大简化了数据访问层的繁琐的重复性代码
- hibernate 是一个优秀的 ORM 实现:很多程度上简化了 DAO 层的编码功能
- 提供了缓存机制:是程序执行更改的高效
hibernate 流程
- 读取并解析配置文件
- 创建 SessionFactory 并打开 Session
- 创建事务
- 执行持久化操作
- 提交事务
- 关闭 Session、SessionFactory
ORM 框架概念
- ORM(Object Relation Mapping)对象关系映射,是把数据库中的关系数据映射成为程序中的对象,将数据库关系对象化,使开发高效化,可移植性强
hibernate 中如何在控制台查看打印的 SQL 语句
在 Config 里面把 hibernate. show_SQL 设置为 true 就可以。但不建议开启,开启之后会降低程序的运行效率
hibernate 查询方式
- HQL:与原生 sql 相比,表名换成了类名或对象名
- SQL:原生 sql 查询
- QBC:首先 session 实例创建 Criteria 对象,再通过 Restrictions 设置查询条件、Order 设置排序,最后通过 list 方法获取结果集
get()和 load()的区别
- 数据查询时,没有 OID 指定的对象,get() 返回 null;load() 返回一个代理对象
- load() 支持延迟加载;get() 不支持延迟加载
说一下 hibernate 的缓存机制
- 一级缓存:也叫 Session 缓存,只在 Session 作用范围内有效,不需要用户干涉,由 hibernate 自身维护,可以通过:evict(object)清除 object 的缓存;clear()清除一级缓存中的所有缓存;flush()刷出缓存
- 二级缓存:应用级别的缓存,在所有 Session 中都有效,支持配置第三方的缓存,如:EhCache
hibernate 对象的几种状态
- 临时/瞬时状态:直接 new 出来的对象,该对象还没被持久化(没保存在数据库中),不受 Session 管理
- 持久化状态:当调用 Session 的 save/saveOrupdate/get/load/list 等方法的时候,对象就是持久化状态
- 游离状态:Session 关闭之后对象就是游离状态
在 hibernate 中 getCurrentSession 和 openSession 的区别
- 绑定当前线程;getCurrentSession 会,openSession不会
- 事务提交:getCurrentSession 事务是 Spring 控制的,并且不需要手动关闭,而 openSession 需要我们自己手动开启和提交事务
hibernate 实体类必须要有无参构造函数吗?为什么?
- 必须要,因为 hibernate 框架要使用 reflection api,通过调用 ClassnewInstance() 来创建实体类的实例,如果没有无参的 构造函数就会抛出异常
Dubbo
dubbo 概念
- Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目
- 不需要依赖 Web 容器
- 不支持分布式事务
- 服务调用默认是同步等待结果阻塞的,支持异步调用
dubbo 特点
-
面向接口代理:服务以接口为粒度,为开发者屏蔽远程调用底层细节
-
智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况
-
服务自动注册与发现:支持多种注册中心服务,服务实例上下线实时感知
-
高度可扩展能力
-
运行期流量调度:内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能
-
可视化的服务治理与运维:提供丰富服务治理、运维工具
dubbo 和 Spring Cloud 的区别
- 通信方式不同:Dubbo 使用 RPC 通信,Spring Cloud 使用 HTTP restFul
- 组成部分不同:Spring Cloud 拆分了很多组件,每个组件都有很多可替换方案,Dubbo只有注册中心能换方案
- 学习成本:Spring Cloud 各个组件更新速度很快,且配置繁琐,学习成本较高
dubbo 内置了哪几种服务容器
- Spring Container
- Jetty Container
- Log4j Container
dubbo 服务节点角色
-
注册中心(registry):生产者在此注册并发布内容,消费者在此订阅并接收发布的内容
-
消费者(consumer):消费从注册中心获取的到的方法
-
生产者(provider):服务端,生产内容,生产前需要依赖容器(先启动容器)
-
容器(container):生产者在启动执行的时候,必须依赖容器才能正常启动(默认依赖的是spring容器),dubbo 无法脱离容器单独存在
-
监控中心(monitor):是dubbo提供的一个jar工程。主要功能是监控服务端和消费端的使用数据
dubbo 使用的注册中心
默认使用 Zookeeper 作为注册中心,还有 Redis、Multicast、Simple 注册中心,但不推荐
dubbo 有哪几种配置方式
- Spring 配置文件配置方式
- Java API 配置方式
dubbo 使用的通信框架
Dubbo 默认使用 Netty 框架,也是推荐的选择,另外内容还集成有Mina、Grizzly
dubbo 点对点直联
- 在开发及测试环境下,以服务接口为单位,绕过注册中心,只测试指定服务提供者
- 指定提供者配置暴露端口和接口方法,消费者配置绑定即可
一个服务接口有多种实现时如何处理
当一个接口有多种实现时,可以用 group 属性来分组,服务提供方和消费方都指定同一个 group 即可
dubbo 缓存
Dubbo 提供了声明式缓存,用于加速热门数据的访问速度,以减少用户加缓存的工作量
RPC 概念
- 远程过程调用协议:它是一种不需要了解底层网络技术通过网络从远程计算机程序上请求服务的协议
- 会话层:RPC 是基于 Socket 的,工作在会话层”
Zookeeper
zookeeper 概念
- 为分布式应用提供一致性服务的开源组件:内部为一个分层的文件系统目录树结构,规定同一个目录下只能有一个唯一的文件名
- 所提供的功能包括:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等
分布式锁概念
- 分布式环境中,一个方法或属性在同一时间只能被一台机器上的一个线程访问
-
高可用:高可用的获取锁与释放锁
-
具备可重入性:每次并发使用某方法或属性时,不会造成数据错误
-
具备锁失效机制:防止死锁(锁故障)
-
具备非阻塞锁特性:当没有获取到锁时立即返回获取锁失败,防止阻塞
分布式锁解决的问题
- 为了保证一个方法或属性在高并发下同时间只能被同一个线程执行
- 实现一种跨JVM的互斥机制来控制共享资源的访问(多线程、多进程、跨机器,单机锁会失效)
zookeeper分布式锁获取流程
-
创建目录 MyZookeeper
-
创建文件节点:多个线程并发想获取锁就在 MyZookeeper 目录下创建各自临时顺序节点(类似于队列缓存,节点编号名递增)
-
最小节点获取锁:获取 MyZookeeper 目录下所有子节点,如果线程 A 的节点名最小则获取锁,其他线程节点设置监听比自己小的节点
-
其他节点竞争锁:线程A处理完,删除自己的节点,线程B监听到变更事件,再次判断自己是不是最小节点,如果是则获取锁
SpringCloud
SpringCloud 概念
- 基于Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成,能够快速构建执行有限数据处理的微服务架构
微服务概念
- 将单一应用程序划分为一组小的服务,每个服务运行在其独立的自己的进程中,服务之间相互协调、互相配合
- 服务之间采用轻量级的通信机制互相沟通(RESTful),每个服务能够被独立的构建在生产环境中
SpringCloud 特点
-
易于开发和维护:一个微服务只会关注一个特定的业务功能,业务清晰、代码量少
-
容易解决复杂问题:将将庞大的单体应用分解成一系列服务
-
易修改易部署:只需要重新部署某个修改了的服务
-
技术栈丰富:在微服务架构中,可以结合项目业务及团队的特点,合理的选择技术栈
-
按需伸缩:可根据需求,实现细粒度的扩展
-
单个微服务启动较快
SpringCloud 核心组件
- Eureka-服务注册中心:专门提供服务注册与发现中心功能
- Ribbon-服务调用:基于 HTTP 和 TCP 的负载均衡消费客户端,请求其他服务是通过 RestTemplate 请求实现
- Feign-服务调用:集成了 Ribbon 的默认实现负载均衡的声明式伪 HTTP 客户端,通过接口+ @FeignClient 注解+ SpringMVC 注解实现请求其他服务
- Hystrix-熔断器:发起请求是通过Hystrix的线程池来⾛的,不同的服务⾛不同的线程池,实现了不同服务调⽤的隔离,避免了服务雪崩的问题
- Zuul-路由网关:前端调⽤后端系统,统⼀从 Zuul ⽹关进⼊并由 Zuul ⽹关转发请求给对应的服务
如何实现负载均衡
- 网关;通过 zuul、nginx 对消费端实现负载均衡
- 服务调用时:通过 Ribbon 对生产端实现负载均衡
如何防止服务崩溃
-
重试机制:请求服务失败,例如 zookeeper 会自动重新请求
-
限流:限制接口访问频次、极端情况将部分请求杀死,随机保留部分请求(秒杀)
-
熔断机制:请求达到一定数量时,直接断开所有请求与服务器连接,防止服务宕机崩溃(秒杀)
-
负载均衡:微服务的同模块多服务模式,多个服务一起处理请求,降低负载
-
服务降级:当某个服务超负载时,将此服务下线,此服务不可用,但其他服务依旧可以用
Http 协议概念
- 超文本传输协议:通过浏览器和服务器进行数据交互,进行超文本(文本、图片、视频等)传输的规定,是基于 TCP 协议的无状态协议
- 应用层:HTTP协议处于 TCP/IP 协议体系的应用层
HTTP 协议与 RPC 协议区别
- RPC 是一种 API(会话层),HTTP 是一种无状态的网络协议(应用层)
- 难度:HTTP 开发比 RPC 简单:
- RPC 比 HTTP 效率高:HTTP发明的初衷是为了传送超文本的资源,协议设计的比较复杂,效率比 RPC 低很多
- 传输数据:HTTP大部分是通过 Json 来实现的,RPC实现高效的二进制传输
- 连接时间:RPC 是长连接,HTTP 一般是短连接(三次握手,可配置长连接)
CAP 理论
-
C(一致性):在分布式系统中的所有数据备份,在同一时刻是否同样的值(等同于所有节点访问同一份最新的数据副本,并发读写时才发生)
-
A(可用性):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
-
P(分区容错性):分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务(最重要)
-
CAP 理论认为分布式系统只能兼顾其中的两个特性,即出现 CA、CP、AP 三种情况
-
CA:单点集群,满足一致性,高可用性的系统1,通常可扩展性差,用的最少(传统 Oracle 数据库选择)
-
CP:满足一致性,分区容错性的系统,通常性能不是特别高(大多数网站选择)
-
AP:满足可用性,分区容错性的系统,通常对一致性要求低(Redis、Mongodb 选择)
-
Elasticsearch
elasticsearch 概念
- 处理数以亿计的文档和每秒数以百计的搜索请求的分布式解决方案
- 面向文档型数据库:存储整个对象或者文档并建立索引
elasticsearch 特性
- 安装方便:没有其他依赖,下载后安装非常方便;只用修改几个参数就可以搭建起来一个集群
- 数据处理方便:输入/输出格式为 JSON,不需要定义 Schema,快捷方便
- 操作方便:基本所有操作(索引、查询、甚至是配置)都可以通过 HTTP 接口进行
- 分布式:节点对外表现对等(每个节点都可以用来做入口);加入节点自动均衡
- 多租户:根据不同的用途分索引;可以同时操作多个索引
- 准实时:从文档索引到可以被检索只有轻微延时,约1s
- 支持插件机制:分词插件、同步插件、Hadoop插件、可视化插件等
elasticsearch 常用概念
-
索引:对逻辑数据的逻辑存储(类似数据库),一个索引可以有多个分片,每个分片可以有多个副本并可以存储在多个服务器上
-
类型:一个索引对象可以存储很多不同用途的对象(类似数据表),不同的文档类型不能为相同的属性设置不同的类型
-
字段:对象的属性名称
-
文档:存储在 elasticsearch 中的主要实体/(对象,相当于数据行),每个文档存储在一个索引中并有一个Elasticsearch自动生成的唯一标识符和文档类型,意味着在一个索引中,两个不同类型的文档可以有相同的唯一标识符
-
映射:elasticsearch 在映射中存储有关字段的信息,每一个文档类型都有自己的映射,即使我们没有明确定义
-
节点:集群中每启动一个 ES 实例 都是一个节点,集群中所有节点都保存了集群的信息,但是只有主节点才能修改集群的状态信息
-
分片:一个索引分片存储在多个服务器上,解决内存的限制、硬盘能力、响应慢等问题(分片的数量只能在创建索引的时候指定)
-
副本:一个分片的精确复制,在主分片丢失时,例如该分片数据所在服务器不可用,集群将副本提升为新的主分片
elasticsearch 应用场景
- 强大搜索功能:可以实现类似百度、谷歌等搜索(维基百科搜索高亮、GitHub搜素代码等应用场景)
- 统计:搜索日志或者交易数据,用来分析商业趋势、搜集日志、分析系统瓶颈或者运行发展等
- 预警功能:持续的查询分析某个数据,如果超过一定的值,就进行警告
RocketMQ
rocketmq 概念
- 由阿里巴巴消息中间件团队研发并大规模应用于生产系统的分布式消息中间件
- 综合了其他消息中间件的优点
- 默认采用长轮询的拉模式
rocketmq 优点
- 多种消费模式:支持集群消费、广播消费
- 消息堆积强:支持亿级消息堆积能力,写入时能做到低延迟
- 消息安全:支持消息失败重试机制、消息可查询、消息堆积也保证了消息安全、事务消息
- 严格的消息顺序
- 支持多种集群模式:选举模式、多Master模式、多Master多Slave模式
如何保证高可用
- 主从分离:master 负责读写,slave 负责读,master 宕机,消费者切换到 slave 节点读取消息
- 增加从节点:高可用取决于 slave 数量(读),高并发取决于 master 数量(写)
事务消息的实现机制
- 发送事务消息给 broker
- broker 持久化消息并设置该消息不可见
- 处理业务逻辑:执行本地业务逻辑,结尾标记事务成功
- 触发监听器:事务监听器触发 executeLocalTransaction 返回提交、回滚会触发 broker 的可见、销毁,如果 broker 未接受到监听器返回值则会回查生产者事务执行结果来判断是否消息可见
重复消费如何解决
在网络中断的情况下可能出现,需要保证消费端处理消息的业务逻辑保持幂等性
RocketMq是推模型还是拉模型
rocketmq不管是推模式还是拉模式底层都是拉模式,推模式也是在拉模式上通过长轮询做了一层封装.
rocketmq 的负载均衡
- 生产者负载均衡:发消息的时候,默认会通过轮询队列的方式发送,以达到让消息平均落在不同的队列上,即每个队列接收平均的消息量
- 消费者负载均衡:在一个消息消费队列在同一时间只允许被同一消费组内的一个消费者消费,一个消息消费者能同时消费多个消息队列(队列分摊到对应的消费者达到均衡目的,只针对于集群消费的模式)
rocketmq 支持哪几种消费模式
- 集群模式:相同 Consumer Group 的每个 Consumer 实例平均分摊消息
- 广播模式:相同 Consumer Group 的每个 Consumer 实例都接收全量的消息
MySql
sql优化的常见方式
- 索引:只对经常作为查询条件、排序、分组字段建立索引,避免在索引上使用计算
- 索引失效:where子句中对字段进行函数操作、使用 != 或 <> 操作符、对字段进行null值判断、联合索引没有遵循最左前缀法则都会失效
- 别名:多个表联查使用别名能减少解析时间
- 列:查询列遵从按需所查,不用 * 查出所有字段
- 尽量避免使用子查询
- 禁止不必要的Order By排序
- 大量插入使用批量插入语句
数据库三大范式
- 列不可分
- 有主键
- 仅主键关联:关联其他表只需存主键即可关联,在其他表中不需要存其他字段
mysql 跟权限相关的表
- user:记录允许连接到服务器的用户帐号信息,权限是全局级的
- db:记录各个帐号在各个数据库上的操作权限
- table _ priv:记录数据表级的操作权限
- colu mns _ priv:记录数据列级的操作权限
- host:配合 db 权限表对给定主机上的数据库级操作权限作更细致的控制(这个权限表不受 GRANT 和 REVOKE 语句的影响)
sql 语句分类
- 数据定义语言(DDL):CREATE、DROP 、ALTER
- 数据查询语言(DQL):SELECT
- 数据操作语言(DML):INSERT 、UPDATE、DELETE
- 数据控制语言(DCL):GRANT 、REVOKE、COMMIT、ROLLBACK
分库分表
-
垂直切分:是基于数据库中的"列"进行,某个表字段较多,将不经常用或字段长度较大的字段拆分出去到扩展表中
- 水平切分:是根据表内数据内在的逻辑关系,将同一个表按不同的条件分散到多个数据库或多个表中
Redis
redis 概念
- Redis 是一款基于键值对的 NoSQL 数据库
- 数据结构丰富:与其他键值对数据库不同的是, Redis 中拥有 string (字符串)、 hash (哈希)、list (列表)、set (集合)、 zset (有序集合)等多种数据结构
- 速度快:数据都存在内存里
- 持久化机制:保证了在发生类似断电,机械故障等情况时,内存中的数据不会丢失
- 功能丰富:Redis 还提供了键过期、 布订阅、事务、流水线、 Lua 脚本等多个附加功能
Redis 持久化流程
- 客户端向服务端发送写操作(数据在内存中)
- 服务端接收请求后调用 write 系统调用将数据转移到内存缓冲区(数据在内存缓冲区)
- 操作系统将数据转移到磁盘控制器中(数据在磁盘缓冲区)
- 磁盘控制器将数据写入到磁盘物理介质中(数据在磁盘)