redis為什麼是單執行緒而且速度快?

2022-01-11 17:21:02 字數 1507 閱讀 6598

redis支援的5種資料型別:

1.string(字串)

2.list(陣列或列表)

3.set(集合)

4.hash(雜湊或字典)

5.zset(有序集合)

資料庫的工作模式按儲存方式可分為:

硬碟資料庫和記憶體資料庫。redis 將資料儲存在記憶體裡面,讀寫資料的時候都不會受到硬碟 i/o 速度的限制,所以速度極快。redis採用的是基於記憶體的採用的是單程序單執行緒模型的 kv 資料庫,由c語言編寫,官方提供的資料是可以達到100000+的qps(每秒內查詢次數)。

那麼為什麼redis是單執行緒的?

官方解釋是因為redis是基於記憶體的操作,cpu不是redis的瓶頸,redis的瓶頸最有可能是機器記憶體的大小或者網路頻寬。既然單執行緒容易實現,而且cpu不會成為瓶頸,那就順理成章地採用單執行緒的方案了(畢竟採用多執行緒會有很多麻煩!)。看到這裡,你可能會氣哭!本以為會有什麼重大的技術要點才使得redis使用單執行緒就可以這麼快,沒想到就是一句官方看似糊弄我們的回答!但是,我們已經可以很清楚的解釋了為什麼redis這麼快,並且正是由於在單執行緒模式的情況下已經很快了,就沒有必要在使用多執行緒了!

但是,我們使用單執行緒的方式是無法發揮多核cpu 效能,不過我們可以通過在單機開多個redis 例項來完善!

注意:這裡我們一直在強調的單執行緒,只是在處理我們的網路請求的時候只有乙個執行緒來處理,乙個正式的redis server執行的時候肯定是不止乙個執行緒的,這裡需要大  家明確的注意一下!例如redis進行持久化的時候會以子程序或者子執行緒的方式執行。(持久化看上篇文章)

速度快的原因:

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

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

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

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

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

i/o多路復用 模型:

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

這裡「多路」指的是多個網路連線,「復用」指的是復用同乙個執行緒。

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

Redis為什麼是單執行緒

經過多方資料收集 總結 思考,結論如下 準確地來說,該問題是 為什麼redis採用單程序單執行緒模型 我們從兩個層次去理解 第乙個層次 我們多執行緒的使用情景是io密集型,目的是為了充分利用cpu資源。也就是說當乙個執行緒io等待的時候,另乙個執行緒可以進行執行,達到充分利用cpu資源的效果,不要讓...

面試 為什麼Redis是單執行緒

先給下官網回答 分析 多執行緒使用場景 a充分利用多核cpu b 檔案或者網路io密集型 任務排程 1 redis在linux上 使用管道每秒可以處理百萬請求 如果都是時間複雜度o n 或o log n 命令 單核足以支撐 所以a不滿足 2 redis是針對記憶體操作 所以檔案io不滿足 redis...

Redis為什麼是單執行緒的

因為redis是基於記憶體的操作,cpu不是redis的瓶頸,redis的瓶頸最有可能是機器記憶體的大小或者網路頻寬。既然單執行緒容易實現,而且cpu不會成為瓶頸,那就順理成章地採用單執行緒的方案了。二 詳細原因 1 不需要各種鎖的效能消耗 redis的資料結構並不全是簡單的key value,還有...