1 Star 0 Fork 0

s1046 / 面试题收集

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

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中对应的缓存行无效

空文件

简介

暂无描述 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/s1046/interview.git
git@gitee.com:s1046/interview.git
s1046
interview
面试题收集
master

搜索帮助