導讀:redis是一個高性能的key-value數據庫,在實際開發中常被用于做分布式緩存、消息隊列等。Redis如此受歡迎這其中一個重要原因是因為其讀寫數據速度快,能支持10w+qps(每秒查詢率)。那么Redis快的原因是什么?文本從以下三點展開討論
- 數據存到內存
- 采用單線程模型
- 使用多路I/O復用的I/O模型
1、數據存到內存
Redis數據存在內存中且絕大部分請求是對內存操作,因此在進行讀寫數據操作的時候不會受到硬盤 I/O 速度的限制,速度快。
補充:Redis也提供了兩種數據持久化方式:AOF(可回放的命令日志)與 RDB(內存快照)。兩種持久化方式各有優缺點,從Redis4.0開始允許使用RDB-AOF混合持久化的方式,這種方式結合了兩者的優點。這里本文不做具體討論。
2、采用單線程模型
2.1 文件事件處理器
Redis 服務器是一個事件驅動程序, 處理的事件分為時間事件和文件事件。Redis基于reactor設計模式開發了文件事件處理器用于高效地處理事件。
它的組成結構為4部分:多個套接字(socket)、IO多路復用程序、文件事件分派器、事件處理器(如下圖所示)。因為這個文件處理器是單線程的,所以Redis是單線程模型。
文件事件處理器
2.2單線程模型的優點
通過采用單線程避免了多線程中的上下文切換損耗及不需要考慮鎖問題以及鎖問題帶來的損耗等。
補充:Redis對數據事件的處理是單線程的,但它在其他模塊仍用了多個線程,如異步將數據寫入磁盤進行持久化操作。
3、使用多路I/O復用的I/O模型
3.1 概念介紹
I/O模型分為以下五種:
- 同步阻塞I/O
- 同步非阻塞I/O
- IO多路復用(Reactor設計模式也稱為異步阻塞IO,例子:JAVA的Selector、linux的epoll)
- 信號驅動I/O模型
- 異步非阻塞I/O(Proactor設計模式)
在“Redis使用多路I/O復用模型”中“多路”指的是多個Socket連接,“復用”指的是復用同一個線程。采用多路 I/O 復用技術可以讓單個線程高效的處理多個連接請求。 (關于I/O模型的講解將會在以后的文章里做詳細討論,感興趣的朋友歡迎后續閱讀與討論)
3.2 I/O多路復用模型在Redis中的應用
Redis使用epoll同時監聽多個Socket連接,并給不同Socket關聯不同的處理程序。當被監聽的Sokcet準備好連接應答、請求、應答、關閉等操作時,就會產生對應的文件事件。這時文件事件處理器就會調用Socket之前關聯好的事件處理器來處理這些事件。
4.總結
Redis之所以快其中主要三個原因為:數據存到內存、采用單線程模型避免了些不必要的損耗、使用多路I/O復用的I/O模型讓單個線程高效的處理多個連接請求。快也還有包括其他的原因如數據模型等。