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 為什么這么快?

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM