簡單區(qū)別:
1. Redis中,并不是所有的數(shù)據(jù)都一直存儲在內存中的,這是和Memcached相比一個大的區(qū)別。
2. redis不僅僅支持簡單的k/v類型的數(shù)據(jù),同時還提供list,set,hash等數(shù)據(jù)結構的存儲。
3. Redis支持數(shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
4. Redis支持數(shù)據(jù)的持久化,可以將內存中的數(shù)據(jù)保持在磁盤中,重啟的時候可以再次加載進行使用。
Redis在很多方面具備數(shù)據(jù)庫的特征,或者說就是一個數(shù)據(jù)庫系統(tǒng),而Memcached只是簡單的K/V緩存
下面是來自redis作者的說法(stackoverflow上面)。
You should not care too much about performances. Redis is faster per core with small values, but memcached is able to use multiple cores with a single executable and TCP port without help from the client. Also memcached is faster with big values in the order of 100k. Redis recently improved a lot about big values (unstable branch) but still memcached is faster in this use case. The point here is: nor one or the other will likely going to be your bottleneck for the query-per-second they can deliver.
You should care about memory usage. For simple key-value pairs memcached is more memory efficient. If you use Redis hashes, Redis is more memory efficient. Depends on the use case.
You should care about persistence and replication, two features only available in Redis. Even if your goal is to build a cache it helps that after an upgrade or a reboot your data are still there.
You should care about the kind of operations you need. In Redis there are a lot of complex operations, even just considering the caching use case, you often can do a lot more in a single operation, without requiring data to be processed client side (a lot of I/O is sometimes needed). This operations are often as fast as plain GET and SET. So if you don’t need just GEt/SET but more complex things Redis can help a lot (think at timeline caching).
有網友翻譯如下[1]:
沒有必要過多的關注性能。由于Redis只使用單核,而Memcached可以使用多核,所以在比較上,平均每一個核上Redis在存儲小數(shù)據(jù)時比Memcached性能更高。而在100k以上的數(shù)據(jù)中,Memcached性能要高于Redis,雖然Redis最近也在存儲大數(shù)據(jù)的性能上進行優(yōu)化,但是比起Memcached,還是稍有遜色。說了這么多,結論是,無論你使用哪一個,每秒處理請求的次數(shù)都不會成為瓶頸。
你需要關注內存使用率。對于key-value這樣簡單的數(shù)據(jù)儲存,memcache的內存使用率更高。如果采用hash結構,redis的內存使用率會更高。當然,這些都依賴于具體的應用場景。
你需要關注關注數(shù)據(jù)持久化和主從復制時,只有redis擁有這兩個特性。如果你的目標是構建一個緩存在升級或者重啟后之前的數(shù)據(jù)不會丟失的話,那也只能選擇redis。
你應該關心你需要的操作。redis支持很多復雜的操作,甚至只考慮內存的使用情況,在一個單一操作里你常??梢宰龊芏啵恍枰獙?shù)據(jù)讀取到客戶端中(這樣會需要很多的IO操作)。這些復雜的操作基本上和純GET和POST操作一樣快,所以你不只是需要GET/SET而是更多的操作時,redis會起很大的作用。
對于兩者的選擇還是要看具體的應用場景,如果需要緩存的數(shù)據(jù)只是key-value這樣簡單的結構時,我在項目里還是采用memcache,它也足夠的穩(wěn)定可靠。如果涉及到存儲,排序等一系列復雜的操作時,毫無疑問選擇redis。
其他:
1、 Redis和Memcache都是將數(shù)據(jù)存放在內存中,都是內存數(shù)據(jù)庫。不過memcache還可用于緩存其他東西,例如圖片、視頻等等。
2、Redis不僅僅支持簡單的k/v類型的數(shù)據(jù),同時還提供list,set,hash等數(shù)據(jù)結構的存儲。
3、虛擬內存–Redis當物理內存用完時,可以將一些很久沒用到的value 交換到磁盤
4、過期策略–memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire 設定,例如expire name 10
5、分布式–設定memcache集群,利用magent做一主多從;redis可以做一主多從。都可以一主一從
6、存儲數(shù)據(jù)安全–memcache掛掉后,數(shù)據(jù)沒了;redis可以定期保存到磁盤(持久化)
7、災難恢復–memcache掛掉后,數(shù)據(jù)不可恢復; redis數(shù)據(jù)丟失后可以通過aof恢復
8、Redis支持數(shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
關于redis和memcache的不同,下面羅列了一些相關說法,供記錄:
redis和memecache的不同在于[2]:
1、存儲方式:
memecache 把數(shù)據(jù)全部存在內存之中,斷電后會掛掉,數(shù)據(jù)不能超過內存大小
redis有部份存在硬盤上,這樣能保證數(shù)據(jù)的持久性,支持數(shù)據(jù)的持久化(筆者注:有快照和AOF日志兩種持久化方式,在實際應用的時候,要特別注意配置文件快照參數(shù),要不就很有可能服務器頻繁滿載做dump)。
2、數(shù)據(jù)支持類型:
redis在數(shù)據(jù)支持上要比memecache多的多。
3、使用底層模型不同:
新版本的redis直接自己構建了VM 機制 ,因為一般的系統(tǒng)調用系統(tǒng)函數(shù)的話,會浪費一定的時間去移動和請求。
4、運行環(huán)境不同:
redis目前官方只支持Linux 上去行,從而省去了對于其它系統(tǒng)的支持,這樣的話可以更好的把精力用于本系統(tǒng) 環(huán)境上的優(yōu)化,雖然后來微軟有一個小組為其寫了補丁。但是沒有放到主干上
個人總結一下,有持久化需求或者對數(shù)據(jù)結構和處理有高級要求的應用,選擇redis,其他簡單的key/value存儲,選擇memcache。
下面重點分析Memcached和Redis兩種方案:
Memcached介紹
Memcached 是一個高性能的分布式內存對象緩存系統(tǒng),用于動態(tài)Web應用以減輕數(shù)據(jù)庫負載。它通過在內存中緩存數(shù)據(jù)和對象來減少讀取數(shù)據(jù)庫的次數(shù),從而提供動態(tài)、數(shù)據(jù)庫驅動網站的速度,現(xiàn)在已被LiveJournal、hatena、Facebook、Vox、LiveJournal等公司所使用。
Memcached工作方式分析
許多Web應用都將數(shù)據(jù)保存到 RDBMS中,應用服務器從中讀取數(shù)據(jù)并在瀏覽器中顯示。 但隨著數(shù)據(jù)量的增大、訪問的集中,就會出現(xiàn)RDBMS的負擔加重、數(shù)據(jù)庫響應惡化、 網站顯示延遲等重大影響。Memcached是高性能的分布式內存緩存服務器,通過緩存數(shù)據(jù)庫查詢結果,減少數(shù)據(jù)庫訪問次數(shù),以提高動態(tài)Web等應用的速度、 提高可擴展性。下圖展示了memcache與數(shù)據(jù)庫端協(xié)同工作情況:
其中的過程是這樣的:
1.檢查用戶請求的數(shù)據(jù)是緩存中是否有存在,如果有存在的話,只需要直接把請求的數(shù)據(jù)返回,無需查詢數(shù)據(jù)庫。
2.如果請求的數(shù)據(jù)在緩存中找不到,這時候再去查詢數(shù)據(jù)庫。返回請求數(shù)據(jù)的同時,把數(shù)據(jù)存儲到緩存中一份。
3.保持緩存的“新鮮性”,每當數(shù)據(jù)發(fā)生變化的時候(比如,數(shù)據(jù)有被修改,或被刪除的情況下),要同步的更新緩存信息,確保用戶不會在緩存取到舊的數(shù)據(jù)。
Memcached作為高速運行的分布式緩存服務器,具有以下的特點:
1.協(xié)議簡單
2.基于libevent的事件處理
3.內置內存存儲方式
4.memcached不互相通信的分布式
如何實現(xiàn)分布式可拓展性?
Memcached的分布式不是在服務器端實現(xiàn)的,而是在客戶端應用中實現(xiàn)的,即通過內置算法制定目標數(shù)據(jù)的節(jié)點,如下圖所示:
Redis 介紹
Redis是一個key-value存儲系統(tǒng)。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、 list(鏈表)、set(集合)和zset(有序集合)。這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內存中。區(qū)別的是redis會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現(xiàn)了master-slave(主從)同步,當前 Redis的應用已經非常廣泛,國內像新浪、淘寶,國外像 Flickr、Github等均在使用Redis的緩存服務。
Redis 工作方式分析
Redis作為一個高性能的key-value數(shù)據(jù)庫具有以下特征:
1.多樣的數(shù)據(jù)模型
2.持久化
3.主從同步
Redis支持豐富的數(shù)據(jù)類型,最為常用的數(shù)據(jù)類型主要由五種:String、Hash、List、Set和Sorted Set。Redis通常將數(shù)據(jù)存儲于內存中,或被配置為使用虛擬內存。Redis有一個很重要的特點就是它可以實現(xiàn)持久化數(shù)據(jù),通過兩種方式可以實現(xiàn)數(shù)據(jù)持久化:使用RDB快照的方式,將內存中的數(shù)據(jù)不斷寫入磁盤;或使用類似MySQL的AOF日志方式,記錄每次更新的日志。前者性能較高,但是可能會引起一定程度的數(shù)據(jù)丟失;后者相反。 Redis支持將數(shù)據(jù)同步到多臺從數(shù)據(jù)庫上,這種特性對提高讀取性能非常有益。
Redis如何實現(xiàn)分布式可拓展性?
2.8以前的版本:與Memcached一致,可以在客戶端實現(xiàn),也可以使用代理,twitter已開發(fā)出用于Redis和Memcached的代理Twemproxy 。
3.0 以后的版本:相較于Memcached只能采用客戶端實現(xiàn)分布式存儲,Redis則在服務器端構建分布式存儲。Redis Cluster是一個實現(xiàn)了分布式且允許單點故障的Redis高級版本,它沒有中心節(jié)點,各個節(jié)點地位一致,具有線性可伸縮的功能。如圖給出Redis Cluster的分布式存儲架構,其中節(jié)點與節(jié)點之間通過二進制協(xié)議進行通信,節(jié)點與客戶端之間通過ascii協(xié)議進行通信。在數(shù)據(jù)的放置策略上,Redis Cluster將整個 key的數(shù)值域分成16384個哈希槽,每個節(jié)點上可以存儲一個或多個哈希槽,也就是說當前Redis Cluster支持的大節(jié)點數(shù)就是16384。
綜合結論
應該說Memcached和Redis都能很好的滿足解決我們的問題,它們性能都很高,總的來說,可以把Redis理解為是對Memcached的拓展,是更加重量級的實現(xiàn),提供了更多更強大的功能。具體來說:
1.性能上:
性能上都很出色,具體到細節(jié),由于Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在存儲小數(shù)據(jù)時比
Memcached性能更高。而在100k以上的數(shù)據(jù)中,Memcached性能要高于Redis,雖然Redis最近也在存儲大數(shù)據(jù)的性能上進行優(yōu)化,但是比起 Memcached,還是稍有遜色。
2.內存空間和數(shù)據(jù)量大?。?br />MemCached可以修改大內存,采用LRU算法。Redis增加了VM的特性,突破了物理內存的限制。
3.操作便利上:
MemCached數(shù)據(jù)結構單一,僅用來緩存數(shù)據(jù),而Redis支持更加豐富的數(shù)據(jù)類型,也可以在服務器端直接對數(shù)據(jù)進行豐富的操作,這樣可以減少網絡IO次數(shù)和數(shù)據(jù)體積。
4.可靠性上:
MemCached不支持數(shù)據(jù)持久化,斷電或重啟后數(shù)據(jù)消失,但其穩(wěn)定性是有保證的。Redis支持數(shù)據(jù)持久化和數(shù)據(jù)恢復,允許單點故障,但是同時也會付出性能的代價。
5.應用場景:
Memcached:動態(tài)系統(tǒng)中減輕數(shù)據(jù)庫負載,提升性能;做緩存,適合多讀少寫,大數(shù)據(jù)量的情況(如人人網大量查詢用戶信息、好友信息、文章信息等)。
Redis:適用于對讀寫效率要求都很高,數(shù)據(jù)處理業(yè)務復雜和對安全性要求較高的系統(tǒng)(如新浪微博的計數(shù)和微博發(fā)布部分系統(tǒng),對數(shù)據(jù)安全性、讀寫要求都很高)。
需要慎重考慮的部分
1.Memcached單個key-value大小有限,一個value大只支持1MB,而Redis大支持512MB
2.Memcached只是個內存緩存,對可靠性無要求;而Redis更傾向于內存數(shù)據(jù)庫,因此對對可靠性方面要求比較高
3.從本質上講,Memcached只是一個單一key-value內存Cache;而Redis則是一個數(shù)據(jù)結構內存數(shù)據(jù)庫,支持五種數(shù)據(jù)類型,因此Redis除單純緩存作用外,還可以處理一些簡單的邏輯運算,Redis不僅可以緩存,而且還可以作為數(shù)據(jù)庫用
4.新版本(3.0)的Redis是指集群分布式,也就是說集群本身均衡客戶端請求,各個節(jié)點可以交流,可拓展行、可維護性更強大。
ref:
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。