redis和memcached的區別

Redis支持多種複雜數據結構

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

性能對比

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

redis的線程模型

redis內部使用的是文件事件處理器file event handler,這個file event handler是單線程的,因此咱們說redis是單線程模型。多線程

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

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

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

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

客戶端 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 語言實現的程序「距離」操做系統更近,執行速度相對會更快。
  • 單線程反而避免了多線程的頻繁上下文切換問題,預防了多線程可能產生的競爭問題。
相關文章
相關標籤/搜索