Spring中Bean的作用域

作用域也就是生命周期
1.singleton:单例,整个IOC容器中只有一个Bean
2.prototype:多例,每次在IOC容器中获取指定Bean的时候都会创建一个新的实例
但是在基于Spring框架的Web应用中增加一个会话维度
1.Request:针对每一个Http请求都会创建一个Bean
2.Session:同一个Session共享同一个Bean,不同的Session产生不同的Bean
3.GlobalSession:针对全局Session维度共享一个Bean


Mybatis的缓存机制

一级缓存:Mybatis为了避免每次查询都去查询数据库,会把查询到的数据放入SQL Session本地缓存中,命中就可以直接读取
二级缓存:多个用户查询数据,任何一个用户拿到了数据就会放入二级缓存中,其他用户就从二级缓存中加载数据


Spring中事务传播行为

事务的传播行为就是指多个声明的事务的方法相互调用时事务如何传递
Spring中有7中:
1.required:默认,如果当前存在事务就加入到当前事务中执行,不存在事务就开启一个新事物
2.required_new:无论当前是否存在事务都会新开启一个事务
3.nested:当前存在事务就嵌套到当前事务中执行,否则新建一个事务,类似required_new
4.support:支持当前事务,如果当前不存在事务就以非事务执行
5.not_support:以非事务方式执行,如果当前存在事务就把当前事务挂起
6.mandatory:强制事务执行,如果当前不存在就抛出异常
7.never:当前存在事务就抛出异常


聚簇索引和非聚簇索引

聚簇索引:基于主键创建的索引,InnoDB中只能存在一个聚簇索引,存储了表的完整数据,索引即数据
非聚簇索引:除了主键之外创建的索引,或者联合索引,叶子节点存储的是对应数据的位置,一般需要回表


ThreadLocal

ThreadLocal是一种线程隔离机制,提供了多线程环境下对于共享变量访问的安全性,将需要共享的变量复制一个副本,用空间换时间,每个线程只操作自己的副本,即解决了线程安全问题,又避免了多线程竞争锁的一个开销
实现原理:Thread类中有一个成员变量ThreadLocalMap,专门用来存储当前线程共享变量的一个副本,后续的操作都是从ThreadLocalMap中操作


Wait和Notify为什么要在synchronized代码块中使用

不在synchronized代码块中使用jdk会抛出异常,wait让线程等待并释放锁,需要另一个线程进行notify,多个线程之间需要竞争到锁资源,所以必须使用synchronized


volatile

1.保证多线程环境下对于共享变量的可见性
线程有工作缓存,修饰后每次修改会去主存中获取变量
2.通过增加内存屏障去防止多个指令进行重排序


缓存雪崩和缓存穿透问题

缓存雪崩:大量key同时过期,导致大量请求查询数据库
解决:1.设置不同过期时间,2.加锁
缓存穿透:大量不存在的key访问数据库,恶意攻击
解决:1.缓存null,2.布隆过滤器,把需要缓存的数据缓存到布隆过滤器中,布隆过滤器采用bitmap,占用空间小


分布式锁的理解与实现

生命周期是多线程多机器节点
1.排他性
2.可重入性
3.锁的获取和释放
4.锁的失效机制:避免死锁


Redis内存淘汰算法和原理

redis中内存淘汰策略是指当内存达到了maxmemory上限时,释放内存的行为
1.Random算法:随机
2.TTL算法:在设置了过期时间的key中去找到更早过期的key移除
3.LRU算法:移除最近很少使用的key
redis会维护一个大小为16的候选池,池中的数据会根据时间进行排序后随机抽取5个key放入池子中,当池子满了以后,访问的时间间隔最大的key就会被淘汰
问题:一个key很长时间没有访问,最近一段时间访问了,LRU认为是热点key不会淘汰
4.LFU算法:与LRU类似:通过访问频率和上次访问时间来移除,如果一段时间没有读写就会降低访问频率
增加了访问频率维度统计访问量,通过两个双向链表维护了一个二维链表,一个用来保存访问频率,另一个用来保存访问频率相同的元素


创建对象的过程 (不全)

首先JVM会检查需要实例化的对象是否已经被加载并初始化,如果没有,JVM需要立刻加载目标类,然后调用目标类的构造器,目标类的加载是通过类加载器来实现的,主要是把一个类加载到内存中,然后初始化主要是对类中的静态变量,成员变量,静态代码块进行初始化,根据目标对象的大小,在堆内存上开辟空间


Lock和synchronized

1.都是java中用来解决线程安全问题的工具
2.synchronized是java中的一个关键字,Lock是JUC包中的一个接口,实现类包括ReentrantLock
3.Lock的灵活性更好,可以自主决定加锁和释放的时机
4.提供非阻塞竞争锁的方法 tryLock(),提供了公平锁和非公平锁机制