相比於memcached,redis擁有更可能是數據結構,因此支持更多的數據操做,redis容許的value數據結構類型有5種:String(字符串)、List(列表)、Set(集合)、Hash(哈希)、Zset(有序集合)。redis
redis只支持單核,memcached可使用多核,因此平均每個核上 redis 在存儲小數據時比 memcached 性能更高。可是在大數據存儲上的處理比起memcached,redis仍是稍微遜色了點。數據結構
redis內部使用的是文件事件處理器file event handler,這個file event handler是單線程的,因此咱們說redis是單線程模型。多線程
文件事件處理器的結構包含 4 個部分:併發
多個 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
事件與命令回覆處理器的關聯。操作系統