被騰訊問蒙的各種Redis複雜問題

dipingxian 發表於 2021-09-14
Redis 騰訊

今天去騰訊面試,被問到多個redis問題,面試的時候沒有答好,還好把問題記下來。

下面我們一起來看看

騰訊通道面:

  • 1、redis為什麼可以達到單機10萬QPS,為什麼這麼快?

  • 2、redis 底層資料結構

  • 3、哨兵模式和叢集模式有什麼區別

  • 4、怎麼解決redis key過熱的問題?

被騰訊問蒙的各種Redis複雜問題

我們逐個分析

第一個問題:redis為什麼可以達到單機10萬QPS,為什麼這麼快?

主要有這麼3個原因:

  1. Redis為什麼這麼快
  • 完全基於記憶體,絕大部分請求是純粹的記憶體操作,非常快速。

  • 採用單執行緒,避免了不必要的上下文切換和競爭條件,也不存在多程式或者多執行緒導致的切換而消耗 CPU;

  • 使用多路I/O複用模型,非阻塞IO;

  • 使用底層模型不同,它們之間底層實現方式以及與客戶端之間通訊的應用協議不一樣,Redis直接自己構建了VM 機制 ,因為一般的系統呼叫系統函式的話,會浪費一定的時間去移動和請求;

2. 同步非阻塞I/O—多路複用 多路I/O複用模型是利用 select、poll、epoll 可以同時監察多個流的 I/O 事件的能力,在空閒的時候,會把當前執行緒阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,於是程式就會輪詢一遍所有的流(epoll 是隻輪詢那些真正發出了事件的流),並且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。這裡“多路”指的是多個網路連線,“複用”指的是複用同一個執行緒。

被騰訊問蒙的各種Redis複雜問題

  • 多路:多個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的哨兵模式和叢集模式

第四個問題:怎麼解決redis key過熱的問題?

怎麼解決redis key過熱的問題

本作品採用《CC 協議》,轉載必須註明作者和本文連結