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 具有很高的吞吐量。
參考文章:
視頻 | IO 多路複用 select/poll/epoll 介紹
個人公衆號《駭客與畫家》,歡迎關注