Redis 爲什麼這麼快?

1. 純內存操作,肯定快

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

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 是隻輪詢那些真正發出了事件的流),並且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。

這裏“多路”指的是多個網絡連接,“複用”指的是複用同一個線程。

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

參考文章:

Redis 爲什麼這麼快?

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

Redis 數據類型及應用場景

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

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

個人公衆號《駭客與畫家》,歡迎關注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章