缓存
1.如何保证redis与数据库一致性
redis面试:如何保证缓存和数据库数据的一致性?_使用update更新数据,json缓存不更新-CSDN博客
如果先删除缓存,再删除数据库,数据不一致,
解决
删
1.先操作缓存但不删除缓存,
2.双删法则
写
先给缓存设置过期时间,
引入mq保证原子性操作
2.redis如何配置key的过期时间,时间原理是什么
Redis中如何配置key的过期时间?他的是实现原理是什么?_idea配置redis ke过期时间-CSDN博客
1. EXPIRE
设置key之后,然后设置过期时间,设置key的同时设置过期时间
2. SETEX
设置同时设置过期时间
原理:
1.定时删除
2. 延迟删除 获取get ,set 时判断是否过期,过期删除
时间单位默认s
Redis使用两种方式结合的形式
- 定期删除要注意执行频率和执行时长
定期删除会遍历每个database(默认16个,从0开始),检查当前库中的随机20个(默认),随机抽查key,如果有过期,则删除;
程序中有个全局变量会记录扫描到了哪个库;
3. 海量数据下如何快速查找一条记录
1.使用布隆过滤器快速过滤不存在的数据
2.redis中使用bitmap实现布隆过滤器
3.在redis中建立数据缓存
4.查询优化 安槽位分配数据
微服务
1.谈谈你对微服的理解,它的优点和缺点
微服务架构的概念、特点、优缺点以及最佳实践-阿里云开发者社区 (aliyun.com)
微服务是一种架构风格,大型单体应用变成较小的单位,降低了整个系统的复杂度
优点
1.微服务更加灵活,耦合性低,每个应用都是独立的
2.技术更新灵活,不依赖具体语言,灵活选择技术栈
3.应用的性能能够得到提升
4.更易组合专门的团队
5.代码复用性更高
缺点
1.服务调用复杂度提升,网络,容错问题
2.分布式事物尽量不适用微服务事物
3.测试难度提升
4.运维难度提升
2.springclude 和阿里巴巴的组件
SpringCloud NetFlix
eureka 注册中心
hytirx 服务容错
feign 远程调用
ribbon 负载均衡
zuul 用于网管
config 配置中心,结合get仓库
get 配置中心
SpringCloudAlibaba
nacos 注册中心 ,配置中心(优点,支持热更新)
sentinal 服务容错
dubbo 服务之间的调动 远程调用
RocketMQ用于消息处理
seata 分布式事物管理
springclode getway 适用于网管
2.怎么实现拆分实现高类聚,低耦合
1.微服务之间尽量不要有业务交叉,降低耦合度,
2.微服务之间只能通过接口调用数据,不要绕过接口访问数据
3.微服务之间主要通过同步接口调动,异步事件驱动方式实现高类聚,低耦合
ddd领域模型驱动
中台
阿里退出去除中台,提出小前台,大中台,抽取各个可以复用的功能抽离出来,形成可复用的主键
业务中台,数据中台,技术中台,结合ddd实现领域相关东西
3.什么是spring 谈谈对ioc和aop的理解
sping是企业级框架,简化软件开发,配置过程,简化项目部署环境
优点:
1.低嵌入设计对业务代码污染很低
2.spring di机制(依赖注入)将对象的管理机制交给框架处理,降低了耦合度
3.aop支持将通用功能集中式管理,提供更好的复用性
4.spring类主流框架提供非常好的支持
ioc 控制反转
创建对象的控制权交给spring管理
ioc-3种注入方式
1.selter注入
2.根据注解注入
3.构造器注入
aop 面向切面编程
用于将与业务无关,但却对多个对象产生影响的多个行为,抽取并封装成可重用的模块。
核心--动态代理
jdk 动态代理 被代理对象一定要使用接口 jkd模式使用
cglib 动态代理 被代理对象不一定使用接口
补充:Spring AOP使用篇:熟悉使用前置通知、后置通知、返回通知、异常通知,并了解其相关特性_你在项目里写过前置通知后置通知,在什么业务场景下-CSDN博客
4.Spring容器启动的流程
使用AnnotationConfigApplicationContext 来跟踪一下启动流程:
this(); 初始化reader和scanner
scan(basePackages); 使用scanner组件扫描basePackage下的所有对象,将配置类的BeanDefinition注册到容器中。
refresh(); 刷新容器。
prepareRefresh 刷新前的预处理
obtainFreshBeanFactory: 获取在容器初始化时创建的BeanFactory
prepareBeanFactory: BeanFactory的预处理工作,会向容器中添加一些组件。
postProcessBeanFactory: 子类重写该方法,可以实现在BeanFactory创建并预处理完成后做进一步的设置。
invokeBeanFactoryPostProcessors: 在BeanFactory初始化之后执行BeanFactory的后处理器。
registerBeanPostProcessors: 向容器中注册Bean的后处理器,他的主要作用就是干预Spring初始化Bean的流程,完成代理、自动注入、循环依赖等这些功能。
initMessageSource: 初始化messagesource组件,主要用于国际化。
initApplicationEventMulticaster: 初始化事件分发器
onRefresh: 留给子容器,子类重写的方法,在容器刷新的时候可以自定义一些逻辑。
registerListeners: 注册监听器。
finishBeanFactoryInitialization: 完成BeanFactory的初始化,主要作用是初始化所有剩下的单例Bean。
finishRefresh: 完成整个容器的初始化,发布BeanFactory容器刷新完成的事件。
5.spring容器中,bean的启动流程
1.实例化 当客户端向容器申请bean 容器会初始化bean 并保存到BeanDefinition
2.设置对象属性赋值,spring通过BeanDefinition找到对象的依赖,并将这些对象进行赋值
3.初始化 调用一下几个接口实现 BeanNameAware、BeanClassLoaderAware、BeanFactoryAware、ApplicationContextAware
4.前置处理器BeanPostProcessor 会调用方法,实现前置处理器的初始化
5.InitializingBean初始化 spring 执行set方法 定制初始化逻辑
6.配置init-method定义自定义的初始化逻辑
7.会执行后置处理器BeanPostProcessor,调用调用BeanPostProcessor的postProcessAfterInitialization方法,进行后置处理器
8.销毁 它会自动调用DisposableBean进行销毁
当Bean实现了这个接口,在对象销毁前就会调用destory()方法
9.如果说我们配置destroy-method或者@PreDestroy注解会根据自己定义的销毁逻辑,进行销毁
6.spring中bean是安全的吗?怎么处理?
spring容器中bean没有提供安全的策略,不是性能安全的,因此在spring中,bean不是线程安全的。
sington 单列对象,不管创建多少对象都会返回一个,单列设计模式
prototype 生命周期,作用域 每创建一个对象都会创建一个新的
request 为每个请求产生对象
setion 为每个回话产生对象
global-session 为这个项目创建对象
解决问题:
多个线程修改共享数据会产生线程问题
大部分的bean是无状态的,没有保存值,不存在线程安全的问题。
bean有状态,保存数据 ThreadLocal解决线程安全问题
7.spring中处理循环依赖的问题
spring 循环依赖以及解决方案(吊打面试官)_循环依赖解决方案-CSDN博客
通过构造循环依赖解决,三级缓存
第一级缓存对象最终的单列式缓存
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
第二级 缓存初始化对象
private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);
第三级 对象的ObjectFactory对象
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
对于对象的普通引用,二级缓存会保存不完整的对象,当单列池中找不到依赖属性时,可以从二级缓存中获取到不完整对象,完成对象的创建,在后续的依赖注入过程中,在单列池的引用关系调整为完整的。
如果引用对象配置了aop,那么在单列池中,需要注入动态代理对象,而不是原对象,而生产动态代理需要完成对象初始化之后开始,因此spring增加里三级缓存保证动态代理对象。
8.sping中如何处理我们的事物
什么是事务?spring如何处理事务?_什么是事务?如何使用?如何事务回滚?-CSDN博客
支持两种事物
编程式事物 使用TransactionTemplate实现
声明式事物aop aop的基础上实现了事物实现机制 最大的优点就是不需要添加事物,需要相应的事物规则声明
区别在于
声明式事物只能针对方法级别
事物传播行为
Spring中对事务定义了不同的传播级别: Propagation
1、 PROPAGATION_REQUIRED:默认传播行为。 如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入到事务中。
2、PROPAGATION_SUPPORTS: 如果当前存在事务,就加入到该事务。如果当前不存在事务,就以非事务方式运行。
3、PROPAGATION_MANDATORY: 如果当前存在事务,就加入该事务。如果当前不存在事务,就抛出异常。
4、PROPAGATION_REQUIRES_NEW: 无论当前存不存在事务,都创建新事务进行执行。
5、PROPAGATION_NOT_SUPPORTED: 以非事务方式运行。如果当前存在事务,就将当前事务挂起。
6、PROPAGATION_NEVER : 以非事务方式运行。如果当前存在事务,就抛出异常。
7、PROPAGATION_NESTED: 如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按REQUEIRED属性执行。
Spring中事务的隔离级别:
1、ISOLATION_DEFAULT: 使用数据库默认的事务隔离级别。
2、ISOLATION_READ_UNCOMMITTED: 读未提交。允许事务在执行过程中,读取其他事务未提交的数据。
3、ISOLATION_READ_COMMITTED: 读已提交。允许事务在执行过程中,读取其他事务已经提交的数据。
4、ISOLATION_REPEATABLE_READ: 可重复读。 在同一个事务内,任意时刻的查询结果是一致的。
5、ISOLATION_SERIALIZABLE: 所有事务依次执行。
9.spring 中控制器是不是单列模式,如果是怎么保证线程安全?
控制器是单列模式,是不安全的。
将控制器设置为无状态模式,里面没有数据,而是引用aop,servers。
mysql
1.mysql中有哪几种存储引擎
show ENGINES查看引擎
MYSQL有哪些存储引擎,各自优缺点。_mysql有哪些存储引擎,各自优缺点-CSDN博客
MyISAM
mylsam每个表有两个文件,分别是MYD(存储数据文件)和MYISAM (存储索引文件)
InnoDB
idb索引和数据存储在一起的
2.mylsqm不支持事物,innodb支持事物,支持行级别的
3.mylsqm不支持xa事物,innodb支持xa事物
4.mylsqm不支持savePoints ,innodb支持savePoints
2.什么是脏读,幻读,不可重复读,怎么处理?
脏读 一个事务读取了另一个事务尚未提交的数据
处理
加锁
事物隔离
mvcc
幻读 一个事务在多次查询时,得到了不同数量的符合条件的记录,这是由于其他事务插入、删除了符合条件的记录导致的。
不可重复读 多次查询结果不一致
3.事物基本特征和四大隔离级别
事物的四大特性、四大隔离级别_事物特性-CSDN博客
① Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成 功,要么全部失败。
② Consistency(一致性):事务完成时,数据必须处于一致状态,数据的完整性约束没有被破坏,事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没 有执行过一样。
③ Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性 和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。
4.Durability(持久性):事务结束后,事务处理的结果必须能够得到固化。
4 事务的隔离级别
4.1 Read uncommitted (读未提交)
如果一个事务A已经开始写数据,则另一个事务B不允许写操作。但是可以读取这个事务A修改但未提交的数据。最低级别,任何情况都无法保证。
4.2 Read Committed (读已提交)
事务A只能读取事务B修改并且提交后的数据行,禁止访问事务B处于写状态的数据行。可以避免脏读。
4.3 Repeatable Read(可重复读取)
事务A在读取数据行时,禁止其他事务对该数据行进行更改,但是可以进行读取操作。进行写操作时,禁止其他事务的任何操作。可以防止脏读和不可重复读。
4.4 Serializable (可串行化)
提供严格的隔离级别,要求事务一个个的执行。不能并发执行。有效的防止脏读,不可重复读,幻读。
5 mysql与oracle的区别
mysql支持4中隔离级别,且自动提交,其中默认的隔离级别是repeatable read。
在mysql中查看当前的隔离级别,select @@tx_isolation;
在mysql中设置数据库的隔离级别,set tx_isolation=‘隔离级别名称’,一定要在开启事务之前,设置隔离级别。如果通过jdbc设置事务的隔离级别,也要在开启事务代码前,写上隔离级别代码。
oracle支持两种隔离级别(read committed,serializable),需要手动提交,默认的隔离级别是read committed。
4.数据库的锁
MySQL数据库的锁 --- 六种分类 - 14种锁详细介绍_mysql的锁-CSDN博客
行锁 力度小 加锁资源开销大 innerdb支持
共享锁 读锁 他是多个事物可以对同一个数据共享同一把所 只能读数据
排他锁 写锁 只有一个事物可以获取排他锁 增删改
自增锁 对mysql自增字段的锁 自增锁可以重置crucate table不能回滚
表锁 力度大 开销小 innerdb和myisam都支持
异向锁 不需要用户干预,自己维护自己
全局锁 读写分离 提高性能
全局锁
5.mysql索引结构是怎样的
MySQL的索引——索引的介绍及其数据结构B+树 & 索引的类型 & 索引的使用及其失效场景 & 相关名词解释_mysql的索引结构-CSDN博客
b+树
非叶子不存储数据,只进行数据索引
所有数据都存储在叶子节点中,
每个叶子节点都存有相邻的叶子节点指针
叶子节点按照本身关键字从小到大进行排序
6.聚簇索引和非聚簇索引
数据和索引在一起的索引是聚簇索引
myisam是非聚簇索引 数的叶子节点上的data是引用地址
innerdb 数的叶子节点上的是数据本身
一个表中一个聚簇索引,非聚簇索引有很多个
聚簇索引的物理存储数据和索引的地址是一样的
7.mysql集群怎么搭建
MySQL集群最全详解(图文全面总结)-CSDN博客
master主 slave从
从同步主 不能主同步从
读用从来做 ,读用主来做
8.谈谈mysql分表,多大数据需要分库分表
当表中数据量过大时,整个查询效率降低得非常明显,进行分表,
mycat2
ShardingSphere 实现分表
分片
垂直分片
根据业务角度,能够解决数据库过大的问题
水平分片
数据角度拆分
数据文件超过2g 或者数据量超过500w