Redis 爲何這麼快?

1. 純內存操做,確定快

數據存儲在內存中,讀取的時候不須要進行磁盤的 IOsegmentfault

2. 單線程,無鎖競爭損耗

單線程保證了系統沒有線程的上下文切換緩存

使用單線程,能夠避免沒必要要的上下文切換和競爭條件,沒有多進程或多線程引發的切換和 CPU 的消耗,沒必要考慮各類鎖的問題,沒有鎖釋放或鎖定操做,不會因死鎖而下降性能;網絡

3. C 語言實現,更接近底層操做

Redis 是用 C 語言開發完成的數據結構

4. 多路 I/O 複用模型,非阻塞 IO

採用多路 I/O 複用技術可讓單個線程高效的處理多個網絡鏈接請求(儘可能減小網絡 IO 的時間消耗)多線程

非阻塞 IO 內部實現採用 epoll,採用了 epoll+本身實現的簡單的事件框架。epoll 中的讀、寫、關閉、鏈接都轉化成了事件,而後利用 epoll 的多路複用特性,毫不在 io 上浪費一點時間。框架

5. 數據結構簡單,底層又作了優化

數據結構簡單,對數據操做也簡單,Redis 中的數據結構是專門進行設計的;分佈式

6. 源碼精湛、簡短

擴展:

在 Redis 中,經常使用的 5 種數據結構和應用場景

  • String: 緩存、計數器、分佈式鎖等。
  • List: 鏈表、隊列、微博關注人時間軸列表等。
  • Hash: 用戶信息、Hash 表等。
  • Set: 去重、贊、踩、共同好友等。
  • Zset: 訪問量排行榜、點擊量排行榜等。

多路 I/O 複用模型

多路 I/O 複用模型是利用 select、poll、epoll 能夠同時監察多個流的 I/O 事件的能力,在空閒的時候,會把當前線程阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,因而程序就會輪詢一遍全部的流(epoll 是隻輪詢那些真正發出了事件的流),而且只依次順序的處理就緒的流,這種作法就避免了大量的無用操做。ide

這裏「多路」指的是多個網絡鏈接,「複用」指的是複用同一個線程。性能

採用多路 I/O 複用技術可讓單個線程高效的處理多個鏈接請求(儘可能減小網絡 IO 的時間消耗),且 Redis 在內存中操做數據的速度很是快,也就是說內存內的操做不會成爲影響 Redis 性能的瓶頸,主要由以上幾點造就了 Redis 具備很高的吞吐量。優化

參考文章:

Redis 爲何這麼快?

一文揭祕單線程的 Redis 爲何這麼快?

Redis 數據類型及應用場景

視頻 | IO 多路複用 select/poll/epoll 介紹

Redis 是單線程的,但 Redis 爲何這麼快?

我的公衆號《駭客與畫家》,歡迎關注

相關文章
相關標籤/搜索