(1)Redis支持服務器端的數據操做
redis和memcached相比,redis擁有更多的 數據結構而且支持更豐富的數據操做 ,一般在memcached裏面,你須要將數據拿到客戶端來進行類型的修改而後在set回去,這樣就嚴重增長了網絡IO的次數和數據體積。在redis裏面,這些操做能夠在服務端完成,因此這些複雜的操做就和通常的GET/SET同樣高效。因此,若是須要緩存能支持更復雜的結構和操做,那麼redis是不錯的選擇 。
(2)內存使用率
若是使用簡單的 key-value 存儲的話,Memcached的內存利用率會更高,而若是Redis採用 hash 結構來作 key-value 存儲,因爲其組合式的壓縮,其內存利用率會高於Memcached。
(3)性能
因爲redis只使用單核,而Memcached可使用多核,因此平均每個核上redis在存儲小數據時比Memcached性能更好。而在100K以上的數據中,Memcached性能要高於redis。
(4)集羣模式
memcached沒有原生的集羣模式,須要依靠客戶端來實現集羣中分片寫入數據;redis原生支持cluster模式,官方支持redis cluster集羣模式。react
對比點 | memcached | redis |
---|---|---|
是否支持服務端操做 | 不支持 | 支持 |
數據結構類型 | 簡單 | 複雜多樣 |
內存使用率 | 簡單 key-value 存儲,利用率高 | 採用hash結構存儲,內存利用率高 |
性能 | 存儲大數據性能高 | 存儲小數據性能高 |
集羣模式 | 沒有原生支持 | 原生支持cluster模式 |
要了解redis的線程模式,必須先了解下面幾個概念
(1)文件事件處理器
①redis是基於reactor模式開發了網絡事件處理器,這個處理器叫作 文件事件處理器(file event Handler)。這個文件事件處理器是單線程的,因此redis才叫作單線程模式,採用IO多路複用機制去同時監聽多個socket,根據socket上的事件來選擇對應的事件處理器來處理這個事件。redis
②若是被監聽的socket準備好執行accept、read、write、close等操做的時候,跟操做對應的文件事件就會產生,這個時候文件處理器就會調用以前關聯好的的事件處理器來處理這個事件。緩存
③文件事件處理器是單線程模式運行的,可是經過IO多路複用機制監聽多個socket,能夠實現高性能的網絡通訊模型,又能夠跟內部其餘單線程的模塊進行對接,保證了redis內部的線程模型的簡單性。服務器
④文件事件處理器的結構包含四個部分:多個socket、IO多路複用程序、文件事件分派器、事件處理器(命令請求處理器、命令回覆處理器、鏈接應答處理器,等等)。網絡
⑤多個socket可能併發的產生不一樣的操做,每一個操做對應不一樣的文件 事件,可是IO多路複用程序會監聽多個socket,可是會將socket放到一個隊列中去處理,每次從隊列中取出一個socket給事件分派器,事件分派器把socket給對應的事件處理器。數據結構
⑥而後一個socket的事件處理完了以後,IO多路複用程序纔會將隊列中的下一個socket給事件分派器。事件分派器會根據每一個socket當前產生的事件,來選擇對應的事件處理器來處理。多線程
(2)文件事件
①當socket變得可讀時(好比客戶端對redis執行write操做,或者close操做),或者有新的能夠應答的socket出現時(客戶端redis執行connect操做),socket就會產生一個AE_READABLE事件。併發
②當socket變得可寫的時候(客戶端對redis執行read操做),socket就會產生一個AE_WRITABLE事件。socket
③IO多路複用程序能夠同時監聽AE_READABLE和AE_WRITABLE兩種事件,要是一個socket同時差生了這兩種事件,那麼文件分配器優先處理AE_READABLE事件,而後纔是AE_WRITABLE事件。memcached
(3)文件事件處理器
若是是客戶端要鏈接redis,那麼會爲socket關聯鏈接應答處理器。
若是是客戶端要寫數據到redis,那麼會爲socket關聯命令請求處理器。
若是是客戶端要從redis讀數據,那麼會爲socket關聯命令回覆處理器。
②當客戶端向redis發起請求的時候(無論是讀請求仍是寫請求,都同樣),首先就會在socket產生一個AE_READABLE事件,而後由對應的命令請求處理器來處理。這個命令請求處理器就會從socket中讀取請求的相關數據,而後執行操做和處理。
③接着redis這邊準備好了給客戶端的響應數據以後,就會將socket的AE_WRITABLE事件跟命令回覆處理器關聯起來,當客戶端這邊準備好讀取相應數據時,就會在socket上產生一個AE_WRITABLE事件,會由相應的命令回覆處理器來處理,就是將準備好的響應數據寫入socket,供客戶端讀取。
④命令回覆處理器寫完以後,就會刪除這個socket的AE_WRITABLE事件和命令回覆處理器的關聯關係。
(1)純內存操做。 (2)核心是基於非阻塞的IO多路複用機制 (3)單線程避免了多線程上下文切換的開銷。