今天去騰訊面試,被問到多個redis問題,面試的時候沒有答好,還好把問題記下來。
下面我們一起來看看
騰訊通道面:
1、redis為什麼可以達到單機10萬QPS,為什麼這麼快?
2、redis 底層資料結構
3、哨兵模式和叢集模式有什麼區別
4、怎麼解決redis key過熱的問題?
我們逐個分析
第一個問題:redis為什麼可以達到單機10萬QPS,為什麼這麼快?
主要有這麼3個原因:
- Redis為什麼這麼快
完全基於記憶體,絕大部分請求是純粹的記憶體操作,非常快速。
採用單執行緒,避免了不必要的上下文切換和競爭條件,也不存在多程式或者多執行緒導致的切換而消耗 CPU;
使用多路I/O複用模型,非阻塞IO;
使用底層模型不同,它們之間底層實現方式以及與客戶端之間通訊的應用協議不一樣,Redis直接自己構建了VM 機制 ,因為一般的系統呼叫系統函式的話,會浪費一定的時間去移動和請求;
2. 同步非阻塞I/O—多路複用 多路I/O複用模型是利用 select、poll、epoll 可以同時監察多個流的 I/O 事件的能力,在空閒的時候,會把當前執行緒阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,於是程式就會輪詢一遍所有的流(epoll 是隻輪詢那些真正發出了事件的流),並且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。這裡“多路”指的是多個網路連線,“複用”指的是複用同一個執行緒。
多路:多個TCP連線(Socket或Channel) 多個客戶端的連線
複用:複用一個或多個執行緒 複用是服務端的一個或多個執行緒
服務端幫你監視連線
多路複用要作業系統支援
有一個多路複用叫做select
3. 單執行緒redis和多核CPU 單一執行緒也只能用到一個CPU核心,所以可以在同一個多核的伺服器中,可以啟動多個例項,組成master-master或者master-slave的形式,耗時的讀命令可以完全在slave進行。
第二個問題:redis底層資料結構?
在《Redis設計與實現》這樣描述:
Redis 資料庫裡面的每個鍵值對(key-value) 都是由物件(object)組成的:
資料庫的鍵總是一個字串物件(string object);
資料庫的值則可以是字串物件、列表物件(list)、雜湊物件(hash)、集合物件(set)、有序集合(sort set)物件這五種物件中的其中一種。
下面我們來探討Redis底層資料型別具體實現。
Redis 底層資料結構有一下資料型別:
第三個問題:哨兵模式和叢集模式有什麼區別?
第四個問題:怎麼解決redis key過熱的問題?
本作品採用《CC 協議》,轉載必須註明作者和本文連結