redis和memcache 都是基于內(nèi)存的數(shù)據(jù)存儲系統(tǒng)。memcached是高性能分布式內(nèi)存緩存服務(wù),其本質(zhì)上就是一個內(nèi)存key-value數(shù)據(jù)庫。redis是一個開源的key-value存儲系統(tǒng)。與memcached類似,redis將大部分?jǐn)?shù)據(jù)存儲在內(nèi)存中,支持的數(shù)據(jù)類型包括:字符串、哈希表、鏈表、集合、有序集合以及基于這些數(shù)據(jù)類型的相關(guān)操作。那么,memcache與redis有什么區(qū)別呢?
1、數(shù)據(jù)操作不同?
與Memcached僅支持簡單的key-value結(jié)構(gòu)的數(shù)據(jù)記錄不同,Redis支持的數(shù)據(jù)類型要豐富得多。Memcached基本只支持簡單的key-value存儲,不支持枚舉,不支持持久化和復(fù)制等功能。Redis支持服務(wù)器端的數(shù)據(jù)操作相比Memcached來說,擁有更多的數(shù)據(jù)結(jié)構(gòu)和并支持更豐富的數(shù)據(jù)操作,支持list、set、sorted set、hash等眾多數(shù)據(jù)結(jié)構(gòu),還同時提供了持久化和復(fù)制等功能。
而通常在Memcached里,使用者需要將數(shù)據(jù)拿到客戶端來進行類似的修改再set回去,這大大增加了網(wǎng)絡(luò)IO的次數(shù)和數(shù)據(jù)體積。在Redis中,這些復(fù)雜的操作通常和一般的GET/SET一樣高效。所以,如果需要緩存能夠支持更復(fù)雜的結(jié)構(gòu)和操作, Redis會是更好的選擇。
2、內(nèi)存管理機制不同?
在Redis中,并不是所有的數(shù)據(jù)都一直存儲在內(nèi)存中的。這是和Memcached相比一個最大的區(qū)別。當(dāng)物理內(nèi)存用完時,Redis可以將一些很久沒用到的value交換到磁盤。Redis只會緩存所有的key的信息,如果Redis發(fā)現(xiàn)內(nèi)存的使用量超過了某一個閥值,將觸發(fā)swap的操作,Redis根據(jù)“swappability = age*log(size_in_memory)”計算出哪些key對應(yīng)的value需要swap到磁盤。然后再將這些key對應(yīng)的value持久化到磁盤中,同時在內(nèi)存中清除。這種特性使得Redis可以保持超過其機器本身內(nèi)存大小的數(shù)據(jù)。
而Memcached默認(rèn)使用Slab Allocation機制管理內(nèi)存,其主要思想是按照預(yù)先規(guī)定的大小,將分配的內(nèi)存分割成特定長度的塊以存儲相應(yīng)長度的key-value數(shù)據(jù)記錄,以完全解決內(nèi)存碎片問題。?
從內(nèi)存利用率來講,使用簡單的key-value存儲的話,Memcached的內(nèi)存利用率更高。而如果Redis采用hash結(jié)構(gòu)來做key-value存儲,由于其組合式的壓縮,其內(nèi)存利用率會高于Memcached。?
3、性能不同?
由于Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在存儲小數(shù)據(jù)時比Memcached性能更高。而在100k以上的數(shù)據(jù)中,Memcached性能要高于Redis,雖然Redis也在存儲大數(shù)據(jù)的性能上進行了優(yōu)化,但是比起Memcached,還是稍有遜色。?
4、集群管理不同?
Memcached是全內(nèi)存的數(shù)據(jù)緩沖系統(tǒng),Redis雖然支持?jǐn)?shù)據(jù)的持久化,但是全內(nèi)存畢竟才是其高性能的本質(zhì)。作為基于內(nèi)存的存儲系統(tǒng)來說,機器物理內(nèi)存的大小就是系統(tǒng)能夠容納的最大數(shù)據(jù)量。如果需要處理的數(shù)據(jù)量超過了單臺機器的物理內(nèi)存大小,就需要構(gòu)建分布式集群來擴展存儲能力。?
Memcached本身并不支持分布式,因此只能在客戶端通過像一致性哈希這樣的分布式算法來實現(xiàn)Memcached的分布式存儲。相較于Memcached只能采用客戶端實現(xiàn)分布式存儲,Redis更偏向于在服務(wù)器端構(gòu)建分布式存儲。?