redis和memcached的區別


Redis支持多種復雜數據結構

相比於memcached,redis擁有更多是數據結構,所以支持更多的數據操作,redis允許的value數據結構類型有5種:String(字符串)、List(列表)、Set(集合)、Hash(哈希)、Zset(有序集合)。

性能對比

redis只支持單核,memcached可以使用多核,所以平均每一個核上 redis 在存儲小數據時比 memcached 性能更高。但是在大數據存儲上的處理比起memcached,redis還是稍微遜色了點。

redis的線程模型

redis內部使用的是文件事件處理器file event handler,這個file event handler是單線程的,所以我們說redis是單線程模型。

文件事件處理器的結構包含 4 個部分:

  • 多個 socket
  • IO 多路復用程序
  • 文件事件分派器
  • 事件處理器(連接應答處理器、命令請求處理器、命令回復處理器)

多個 socket 可能會並發產生不同的操作,每個操作對應不同的文件事件,但是 IO 多路復用程序會監聽多個 socket,會將產生事件的 socket 放入隊列中排隊,事件分派器每次從隊列中取出一個 socket,根據 socket 的事件類型交給對應的事件處理器進行處理。

首先,redis 服務端進程初始化的時候,會將 server socket 的 AE_READABLE 事件與連接應答處理器關聯。

客戶端 socket01 向 redis 進程的 server socket 請求建立連接,此時 server socket 會產生一個 AE_READABLE 事件,IO 多路復用程序監聽到 server socket 產生的事件后,將該 socket 壓入隊列中。文件事件分派器從隊列中獲取 socket,交給連接應答處理器。連接應答處理器會創建一個能與客戶端通信的 socket01,並將該 socket01 的 AE_READABLE 事件與命令請求處理器關聯。

假設此時客戶端發送了一個 set key value 請求,此時 redis 中的 socket01 會產生 AE_READABLE 事件,IO 多路復用程序將 socket01 壓入隊列,此時事件分派器從隊列中獲取到 socket01 產生的 AE_READABLE 事件,由於前面 socket01 的 AE_READABLE 事件已經與命令請求處理器關聯,因此事件分派器將事件交給命令請求處理器來處理。命令請求處理器讀取 socket01 的 key value 並在自己內存中完成 key value 的設置。操作完成后,它會將 socket01 的 AE_WRITABLE 事件與命令回復處理器關聯。

如果此時客戶端准備好接收返回結果了,那么 redis 中的 socket01 會產生一個 AE_WRITABLE 事件,同樣壓入隊列中,事件分派器找到相關聯的命令回復處理器,由命令回復處理器對 socket01 輸入本次操作的一個結果,比如 ok,之后解除 socket01 的 AE_WRITABLE 事件與命令回復處理器的關聯。

為什么redis單線程處理效率高?

  • 純內存操作。
  • 核心是基於非阻塞的 IO 多路復用機制。
  • C 語言實現,一般來說,C 語言實現的程序“距離”操作系統更近,執行速度相對會更快。
  • 單線程反而避免了多線程的頻繁上下文切換問題,預防了多線程可能產生的競爭問題。

 


免責聲明!

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



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