Redis 和 Memcached 都是基於內存的數據存儲系統。Memcached是高性能分佈式內存緩存服務,其本質上就是一個內存key-value數據庫。Redis是一個開源的key-value存儲系統。與Memcached相似,Redis將大部分數據存儲在內存中,支持的數據類型包括:字符串、哈希表、鏈表、集合、有序集合以及基於這些數據類型的相關操做。那麼,Memcached與Redis有什麼區別呢?讓咱們一塊兒來看一下。算法
一、數據操做不一樣數據庫
與Memcached僅支持簡單的key-value結構的數據記錄不一樣,Redis支持的數據類型要豐富得多。Memcached基本只支持簡單的key-value存儲,不支持枚舉,不支持持久化和複製等功能。Redis支持服務器端的數據操做相比Memcached來講,擁有更多的數據結構和並支持更豐富的數據操做,支持list、set、sorted set、hash等衆多數據結構,還同時提供了持久化和複製等功能。而一般在Memcached裏,使用者須要將數據拿到客戶端來進行相似的修改再set回去,這大大增長了網絡IO的次數和數據體積。在Redis中,這些複雜的操做一般和通常的GET/SET同樣高效。因此,若是須要緩存可以支持更復雜的結構和操做, Redis會是更好的選擇。緩存
二、內存管理機制不一樣服務器
在Redis中,並非全部的數據都一直存儲在內存中的。這是和Memcached相比一個最大的區別。當物理內存用完時,Redis能夠將一些好久沒用到的value交換到磁盤。Redis只會緩存全部的key的信息,若是Redis發現內存的使用量超過了某一個閥值,將觸發swap的操做,Redis根據「swappability = age*log(size_in_memory)」計算出哪些key對應的value須要swap到磁盤。而後再將這些key對應的value持久化到磁盤中,同時在內存中清除。這種特性使得Redis能夠保持超過其機器自己內存大小的數據。網絡
而Memcached默認使用SlabAllocation機制管理內存,其主要思想是按照預先規定的大小,將分配的內存分割成特定長度的塊以存儲相應長度的key-value數據記錄,以徹底解決內存碎片問題。數據結構
從內存利用率來說,使用簡單的key-value存儲的話,Memcached的內存利用率更高。而若是Redis採用hash結構來作key-value存儲,因爲其組合式的壓縮,其內存利用率會高於Memcached。app
三、性能不一樣分佈式
因爲Redis只使用單核,而Memcached可使用多核,因此平均每個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis,雖然Redis也在存儲大數據的性能上進行了優化,可是比起Memcached,仍是稍有遜色。性能
四、集羣管理不一樣大數據
Memcached是全內存的數據緩衝系統,Redis雖然支持數據的持久化,可是全內存畢竟纔是其高性能的本質。做爲基於內存的存儲系統來講,機器物理內存的大小就是系統可以容納的最大數據量。若是須要處理的數據量超過了單臺機器的物理內存大小,就須要構建分佈式集羣來擴展存儲能力。
Memcached自己並不支持分佈式,所以只能在客戶端經過像一致性哈希這樣的分佈式算法來實現Memcached的分佈式存儲。相較於Memcached只能採用客戶端實現分佈式存儲,Redis更偏向於在服務器端構建分佈式存儲。
小結:Redis和Memcached哪一個更好?
Redis更多場景是做爲Memcached的替代者來使用,當須要除key-value以外的更多數據類型支持或存儲的數據不能被剔除時,使用Redis更合適。若是隻作緩存的話,Memcached已經足夠應付絕大部分的需求,Redis 的出現只是提供了一個更加好的選擇。總的來講,根據使用者自身的需求去選擇纔是最合適的。
(本文由中間件小哥收集整理)