消息中间件的业务场景
消息监听 在分布式项目中保证事务的最终一致性。
消息丢失如何补救
spring的理解
spring是一款轻量级开源的J2EE的框架,它是一个容器框架用来装JavaBean(java对象),中间层框架,可以起到一个连接的作用,让开发更快,更简洁。
Spring具有完善的生态。核心功能是IOC和AOP。
IOC送耦合,AOP面向切面编程,允许通过分离业务逻辑和系统服务进行内聚性开发。
包含并管理应用对象的配置和生命周期,这个意义上他是一个容器。
将简单的组件配置,组合成为傅瓒的应用,这个意义上是一个框架。
Spring中Bean的生命周期是怎样的?
解析类得到beanDefinition
如果有多个构造方法,则要推断构造方法
确定好构造方法后,进行实例化得到一个对象
对对象中里@Autowried注解的属性进行属性填充
回调Aware方法比如BeanNameAware,BeanFactoryAware
调用初始化方法
调用BeanPostProcessr的初始化前的方法
调用初始化方法
调用BeanPostPricessor的初始化后的方法,在这里进行AOP
如果当前创建的bean是地哪里的则会把bean放入单例池
使用Bean
spring 容器关闭时调用DisposableBean中的desory()方法。
IOC是什么?
容器概念/控制反转/依赖注入
IOC是一个容器是个map(key,value),里面存放各种对象(在xml中配置的bean节点,@repository,@service,@controller,@component)在项目启动时会读取配置文件里面的Bean节点,更具全限定类名使用反射创建对象到map里,扫描打上注解的类函数会通过注解的类,通过反射放到map里面。
这个时候map里就有各种对象,接下来我们在代码里需要用到对象时,再通过DI注入(autowired、resource等注解,xml里bean节点内的ref属性,项目启动的时候会读取xml节点ref属性根据id注入,也会扫描这些注解,根据类型id注入,id也就是对象名)。
控制反转
没有引入IOC容器之前,对象A依赖对象B,那么对象A再初始化或者允许到某一节点的时候,自己必须主动去创建对象B或者使用使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手里。
引入IOC容器之后,对象A与对象B之间随去了之间联系,当对象A运行待需要对象B的时候,Ioc容器会主动创建一个对象B注入待对象A需要的地方,
全部对象的控制权全部上缴给第三方IOC容器,所以IOC容器成立整个系统的关键核心,它起到一个类似粘合剂的作用,把系统中所有对象粘合再一起发挥作用,如果没有这个粘合剂,对象与对象之间会彼此失去联系,这儿就是有人把IOC容器比作粘合剂的由来。
依赖注入
获得对象的过程被反转了。控制反转之后,获得依赖对象的过程由自身管理贬称了由IOC容器主动注入,依赖注入是实现IOC的方法,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
Spring中Bean是线程安全的?
不是线程安全的
Spring Bean默认是单例模式,并没有对Bean进行多线程的封装处理。
如何Bean是有状态的那就需要开发人员自己来进行线程安全的保证修改Bean的作用域singleton改为protopteon这样每次请求就相当于new Bean()这样就可以保证线程安全。
有状态就是有数据存储功能
无状态就像不会保存数据。
Spring中Bean的作用域
singleton
prototype
request
session
application
websocket
global-session
跨域如何保证用户状态一致性
无状态服务抛弃session
存入cookie
服务器session同步
ip绑定策略
使用Redis存储·
Spring Session+Redis
redis缓存淘汰机制
redis是一个key-value的数据库
惰性过期
只有当访问一个key时,才会判断key是否已经过期。对CPU比较友好,会造成内存浪费。
定期过期
每隔一段时间扫描一定数量的key,并清除其中过期的key
重写和重载
重写:发生在父子类中
子类去重写父类的方法,方法名相同,参数列表相同
返回值范围小于等于父类,抛出的异常小于等于父类。如果父类方法使用private就不能重写该方法。
重载:重载发生在同一个类中
方法名相同,参数列表不一样(参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符可以不同)
索引失效
模型数空运最快
模糊%like索引会失效
数据类型错误
对于索引使用内部函数
索引类没有进行NULL值限定
对索引列进行加减运算
复合索引如果没有按照最左列进行查找则无法使用索引
全表索引更快
深拷贝和浅拷贝
静态变量和实体变量有什么区别?
HashMap和HashTable有什么区别?
如何实现一个线程安全的map?
什么样的情况下使用多线程?
多线程的创建方式有哪几种?
Thread
runnable
cannable
Executor
线程的生命周期
新建状态 就绪状态(可运行),运行状态,阻塞状态,死亡状态
线程的状态
创建,就绪,运行,阻塞,死亡。
阻塞分为等待阻塞(wait),同步阻塞,其他阻塞(sleep,join)
什么样的情况下会出现死锁
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种相互等待的现象,无外力的作用,他们都无法推进下去
查看最近的一次死锁
show engine innodb status
设置超时时间
解除互斥条件
主动回滚死锁中的某一个事务。
NIO和传统IO有什么区别
NIO 和传统 IO 之间第一个最大的区别是,IO 是面向流的,NIO 是面向缓冲区的。
Redis为什么快。
IO模型使用多路复用器
自身内存存储数据
RDB和AOF
MyISAM与InnoDB都有什么样的区别?
INnoDB支持事务
innoDB支持外键
innoDB是聚集索引
innoDB最小锁粒度是行锁,MyISAM最小粒度锁是表锁
MYSQL的索引
主键索引,普通索引,前缀索引
左连接,右连接,全连接。
redis包含那些基本数据类型
String list set Zset Hash
Spring框架中使用了那些设计模式
工厂模式
模板模式
代理模式
策略模式
单例模式
观察者模式
适配器模式
装饰者模式
分库分表如何保证数据一致性。
对外提供的API如何保证幂等
商户id 来源
Cookie和Session有什么区别
Session的主要作用通过服务端记录服务的状态
cookie保存在客户端
Session更加安全
如何使用session进行身份验证
浏览器输入URL发生了什么?