1.spring解决循环依赖
https://juejin.im/post/6844903715602694152
2.为什么redis不支持事物回滚
为什么Redis不支持回滚
Redis命令在事务中可能会执行失败,但是Redis事务不会回滚,而是继续会执行余下的命令。如果您有一个关系型数据库的知识,这对您来说可能会感到奇怪,因为关系型数据在这种情况下都是会回滚的。
Redis这样做,主要是因为:
只有当发生语法错误(这个问题在命令队列时无法检测到)了,Redis命令才会执行失败, 或对keys赋予了一个类型错误的数据:这意味着这些都是程序性错误,这类错误在开发的过程中就能够发现并解决掉,几乎不会出现在生产环境。由于不需要回滚,这使得Redis内部更加简单,而且运行速度更快。
3.Redis不是只有一个线程吗,它卡死了,是怎么响应script kill 指令的
Lua脚本提供了各式各样的钩子函数,他允许在内部虚拟机执行指令时运行钩子代码,比如每执行N条指令执行一次某个钩子函数,Redis正是使用了这个钩子函数,Redis在钩子函数里会忙里偷闲去处理客户端的请求,并且只有在发现Lua脚本超时后才会处理请求,这个超时时间默认是5s
4.mysql查询语句的执行过程
客户端发起一个请求时,
- 1.会查看缓存是否开启,开启了会先检查缓存,命中了则直接返回,
- 2.没命中服务端会利用parser对sql语句进行词法分析、语法分析,
- 1.会查看缓存是否开启,开启了会先检查缓存,命中了则直接返回,没命中走2
- 2.parser 词法分析、语法分析、构建解析树
- 3.pre processor 预处理器
- 4.optimizer 优化器 生成执行计划
- 5.调用存储引擎api执行查询
5.为什么mysql 索引的存储结构用b+树,不用红黑树
只有两路;2、不够平衡。
红黑树一般只放在内存里面用。例如Java 的TreeMap
6.B+树的优点
- 1)它是B Tree 的变种,B Tree 能解决的问题,它都能解决。B Tree 解决的两大问题
是什么?(每个节点存储更多关键字;路数更多)
- 2)扫库、扫表能力更强(如果我们要对表进行全表扫描,只需要遍历叶子节点就可以
了,不需要遍历整棵B+Tree 拿到所有的数据)
- 3)B+Tree 的磁盘读写能力相对于B Tree 来说更强(根节点和枝节点不保存数据区,
所以一个节点可以保存更多的关键字,一次磁盘加载的关键字更多)
- 4)排序能力更强(因为叶子节点上有下一个数据区的指针,数据形成了链表)
- 5)效率更加稳定(B+Tree 永远是在叶子节点拿到数据,所以IO 次数是稳定的)
7.+为什么选用自增量作为主键索引
如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如下图所示:
这样就会形成一个紧凑的索引结构,近似顺序填满。由于每次插入时也不需要移动已有数据,因此效率很高,也不会增加很多开销在维护索引上。
如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置:
此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。
8.double write的概念
http://blog.itpub.net/22664653/viewspace-1140915/
9.事务的特性原子性、隔离性、持久性,是通过什么技术实现的?
- 原子性:通过使用回退和提交操作实现,回退操作依赖于undolog。
- 隔离性:
当前读
LBCC(基于锁的并发控制):记录锁、间隙锁、临键锁。
快照读
mvcc(多版本并发控制): 查询语句只能查找创建时间小于等于当前事务ID的数据,和删除时间大于当前事务ID的行(或未删除)
— 具体实现依赖undolog和隐藏的冗余版本字段。
- 持久性:
redolog: 记录数据库已经执行过的更新操作,在数据库意外重启或宕机之后,对于buffer pool中还没来得及刷入磁盘的数据页,使用redolog保证数据的完整性
double write:由于文件系统的页大小为4K,而Mysql数据库的页大小为16K,当Mysql将页刷入磁盘时出现宕机或意外重启,可能导Mysql数据库在磁盘中的部分页出现损坏,这种情况下依赖redolog无法实现持久性,因此需引入双写机制。
– 双写机制即:在将缓存数据刷盘之前就先顺序写入到硬盘的共享表double write空间。 顺序写入无须磁盘寻道,性能相对较高
- 一致性:如上三大特性均是为了实现数据库的一致性
volidate关键字理解
- volidate 解决了可见性、有序性
- 可见性 加了volidate修饰的变量,在多线程环境下,加了voLidate的变量,一个线程修改共享变量后会立即同步到主内存,又因为加了volidate后jvm每次会从主内存拿值
- 有序性 禁止指令重排 指令重排是编译器为了优化代码而导致cpu执行代码的顺序和代码书写顺序并不完全一致,而加了volidate修饰的变量,生成的汇编代码,会多出一个lock前缀指令,lock前缀指令相当于一个内存屏障。内屏屏障提供了三个功能
- 1.不会把后面的指令排到指令之前的位置
- 2.他会强制对缓存的修改立即写入主存
- 3.如果是写操作,它会导致其他cpu中对应的缓存行无效