1. 程式人生 > >Redis核心技術---單執行緒

Redis核心技術---單執行緒

以前一直有個誤區,以為:高效能伺服器 一定是 多執行緒來實現的

原因很簡單因為誤區二導致的: 多執行緒 一定比 單執行緒 效率高。其實不然。

redis 核心就是 如果我的資料全都在記憶體裡,我單執行緒的去操作 就是效率最高的,為什麼呢,因為多執行緒的本質就是 CPU 模擬出來多個執行緒的情況,這種模擬出來的情況就有一個代價,就是上下文的切換,對於一個記憶體的系統來說,它沒有上下文的切換就是效率最高的。redis用單個CPU繫結一塊記憶體的資料,然後針對這塊記憶體的資料進行多次讀寫的時候,都是在一個CPU上完成的,所以它是單執行緒處理這個事。在記憶體的情況下,這個方案就是最佳方案  —— 阿里 沈詢

 

因為一次CPU上下文的切換大概在 1500ns 左右。

從記憶體中讀取 1MB 的連續資料,耗時大約為 250us,假設1MB的資料由多個執行緒讀取了1000次,那麼就有1000次時間上下文的切換,

那麼就有1500ns * 1000 = 1500us ,我單執行緒的讀完1MB資料才250us ,你光時間上下文的切換就用了1500us了,我還不算你每次讀一點資料 的時間。

 

那什麼時候用多執行緒的方案呢?

答案是:下層的儲存等慢速的情況。比如磁碟

 

因為磁碟慢,所以如果使用單執行緒,同樣讀取1M的資料會很慢,所以這個時候需要多個執行緒去讀加快讀取進度,想想1000條執行緒同時去讀肯定比一條執行緒要快的多。這裡雖然會有cpu上下文切換時間的消耗,但是這裡因為磁碟實在是太慢了,所以用cpu切換的時間去換取多執行緒的讀取速度是十分划算的,而對於記憶體來說其讀取速度本身就很快,這時如果用cpu切換時間去換讀取速度就不值得了

 

本文轉自:https://blog.csdn.net/artaganan8/article/details/80867672