問題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:不可重復讀和幻讀的精準區別是什么?
答:兩次讀結果不一樣,是不可重復讀,本質是讀到了已經提交的數據。兩次讀到的數據集合不一樣,是幻讀,本質是當前讀和快照讀的不一致。
補充: