為什麼Redis快取速度這麼快?

2022-06-12 15:51:07 字數 1432 閱讀 1061

首先介紹下硬碟資料庫和redis的工作模式

需要先從資料讀取資料到記憶體,記憶體中的資料儲存到硬碟,我們更改硬碟的資料後在儲存到資料庫。這裡的步驟較多,而且還占用我們的硬碟容量。

這種方式相比硬碟資料庫的方式少了記憶體到硬碟這一步,速度回快很多,而且不占用我們的硬碟容量。我們用的redis就是基於這種方式的,看完redis簡介(一)和上面的描述,我們對於redis有了一定的了解。下面我們再介紹redis作為快取為什麼速度這麼快。

redis採用的是基於記憶體的採用的是單程序單執行緒模型的 kv 資料庫,由c語言編寫,官方提供的資料是可以達到100000+的qps(每秒內查詢次數)。這個資料不比採用單程序多執行緒的同樣基於記憶體的 kv 資料庫 memcached 差!有興趣的可以參考官方的基準程式測試:

橫軸是連線數,縱軸是qps。此時,這張圖反映了乙個數量級,希望大家在面試的時候可以正確的描述出來,不要問你的時候,你回答的數量級相差甚遠!

1、完全基於記憶體,絕大部分請求是純粹的記憶體操作,非常快速。資料存在記憶體中,類似於hashmap,hashmap的優勢就是查詢和操作的時間複雜度都是o(1);

2、資料結構簡單,對資料操作也簡單,redis中的資料結構是專門進行設計的;

3、採用單執行緒,避免了不必要的上下文切換和競爭條件,也不存在多程序或者多執行緒導致的切換而消耗 cpu,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的效能消耗;

4、使用多路i/o復用模型,非阻塞io;

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

以上幾點都比較好理解,下邊我們針對多路 i/o 復用模型進行簡單的**:

(1)多路 i/o 復用模型

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

這裡「多路」指的是多個網路連線,「復用」指的是復用同乙個執行緒。採用多路 i/o 復用技術可以讓單個執行緒高效的處理多個連線請求(儘量減少網路 io 的時間消耗),且 redis 在記憶體中運算元據的速度非常快,也就是說記憶體內的操作不會成為影響redis效能的瓶頸,主要由以上幾點造就了 redis 具有很高的吞吐量。

Redis速度為什麼這麼快?

redis是採用c語言寫的,並且屬於單執行緒的,同時redis的瓶頸不是cpu,而是根據機器的記憶體以及網路的頻寬。同時理解其中存在的誤區 1 多執行緒一定比單執行緒快 x 多執行緒切換時會在cpu在造成資源的浪費,從而降低執行速度。2 高效能的伺服器不一定是多執行緒的。速度 cpu 記憶體 磁碟 ...

Redis為什麼這麼快?

今天我在乙個技術群裡提出乙個問題 redis為什麼這麼快,redis的那些特性能夠支援了它的高併發?之前的我,也只是知道redis是記憶體資料庫,所以讀取速度快 io使用的是多路復用,使用乙個執行緒來輪詢描述符,減少了執行緒上下文的切換,將資料庫的開 關 讀 寫都轉化成了時間,所以io時也有加速。雖...

Redis為什麼這麼快?

1 完全基於記憶體,絕大部分請求是純粹的記憶體操作,非常快速。資料存在記憶體中,類似於hashmap,hashmap的優勢就是查詢和操作的時間複雜度都是o 1 2 資料結構簡單,對資料操作也簡單,redis中的資料結構是專門進行設計的 3 採用單執行緒,避免了不必要的上下文切換和競爭條件,也不存在多...