问题1:Redis为什么高效?
答:基于内存,reactor,value的数据组织(五种数据结构),KV的数据组织方式(渐进hash)
问题2:跳表是什么?和红黑树的区别是什么?
答:跳表是一个多层级有序链表,查找时间复杂度是和二分一样的O(log2n)。查询是从上层开始的跳跃查询一直找到目标节点。插入节点的时候,redis采用的是随机层高,有1/4的概率往上升,最高规定是32层。
区别主要在于,跳表的底层是包含所有数据的,适合范围查询,比红黑树效率要高。但是跳表是概率型的数据结构,只有样本数比较多才趋近于log,否则效率不如红黑树。
问题3:aof和rdb的区别是什么?
答:围绕持久化的内容、相同数据量情况下谁的文件大谁的文件小、谁的恢复速度快谁的慢。
问题4:fork写时复制的原理是什么?
答:从父进程fork一个子进程,会把页表直接复制给子进程,同时将两份页表的页表项修改为只读状态,因为是一样的页表,所以指向的是同一片内存。比如当父进程进行修改操作,会触发写保护中断,写保护中断会触发物理内存的复制,然后通过缺页中断修复映射关系,指向复制的内存区域。最后再把父进程的页表项修改为可读可写,子进程的没有修改。
问题5:索引分类
答:按数据结构划分:B+树索引、Hash索引、全文索引
按物理存储划分:聚集索引、辅助索引
按列属性划分:主键索引、唯一索引、普通索引、前缀索引
按列的个数划分:单列索引、组合索引
问题6:索引的代价是什么?
答:围绕空间代价和维护代价展开。每一个索引都是一个B+树,如果要修改一个字段的话,可能要修改多个B+树。
问题7:innodb为什么采用B+树,不采用红黑树
答:因为B+树底层有所有的数据,可以支持范围查询。
因为B+树是多路平衡搜索树比红黑树二路更多,可以降低层高,减少io次数。
问题8:MVCC的实现原理
答:为每行数据保存多个版本的快照,对要读数据的事务提供对应符合条件的快照。具体的条件就是在拍摄快照的时候,产生的Read View数据结构的 内部变量关系。当
trx_id < min_trx_id 和 min_trx_id < trx_id < max_trx_id && trx_id 不属于 m_ids
为事务间可见。
问题9:不可重复读和幻读的精准区别是什么?
答:两次读结果不一样,是不可重复读,本质是读到了已经提交的数据。两次读到的数据集合不一样,是幻读,本质是当前读和快照读的不一致。
补充: