Redis 和Memcached比較

我個人認爲最本質的不同是Redis在很多方面具備數據庫的特徵,或者說就是一個內存數據庫系統,而Memcached只是簡單的K/V緩存,mongodb本質上是一個物理數據庫。

區別:

  1. 性能(網絡IO模型)
    Memcached是多線程,非阻塞IO複用的網絡模型。Memcache可以利用多核優勢,單實例吞吐量極高,可以達到幾十萬QPS,適用於最大程度扛量。
    Redis使用單線程的IO複用模型。由於Redis只使用單核,而Memcached可以使用多核,所以在比較上,平均每一個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis,雖然Redis最近也在存儲大數據的性能上進行優化,但是比起Memcached,還是稍有遜色。

  2. 內存使用
    MemCached可以修改最大內存,採用LRU算法。Redis增加了VM的特性,突破了物理內存的限制。
    使用簡單的key-value存儲的話,Memcached的內存利用率更高,而如果Redis採用hash結構來做key-value存儲,由於其組合式的壓縮,其內存利用率會高於Memcache。
    Memcached使用預分配的內存池的方式,使用slab和大小不同的chunk來管理內存,Item根據大小選擇合適的chunk存儲,內存池的方式可以省去申請/釋放內存的開銷,並且能減小內存碎片產生,但這種方式也會帶來一定程度上的空間浪費,並且在內存仍然有很大空間時,新的數據也可能會被剔除,原因可以參考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/
    Redis使用現場申請內存的方式來存儲數據,並且很少使用free-list等方式來優化內存分配,會在一定程度上存在內存碎片,Redis跟據存儲命令參數,會把帶過期時間的數據單獨存放在一起,並把它們稱爲臨時數據,非臨時數據是永遠不會被剔除的,即便物理內存不夠,導致swap也不會剔除任何非臨時數據(但會嘗試剔除部分臨時數據),這點上Redis更適合作爲存儲而不是cache。

  3. 數據一致性
    Memcached提供了cas命令,可以保證多個併發訪問操作同一份數據的一致性問題。CAS(Check and Set)是一個確保併發一致性的機制,屬於“樂觀鎖”範疇;原理很簡單:拿版本號,操作,對比版本號,如果一致就操作,不一致就放棄任何操作。
    redis使用的是單線程模型,提供了事務的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷,保證了數據按順序提交。

  4. 可靠性
    memecache 把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小。
    redis有部份存在硬盤上,這樣能保證數據的持久性,支持數據的持久化。

  5. 數據備份
    Redis支持數據的備份,即master-slave主從複製。

  6. 分佈式存儲
    redis支持master-slave複製模式
    memcache可以使用一致性hash做分佈式

  7. 數據支持類型
    Memcached基本只支持簡單的key-value存儲,不過memcache還可用於緩存其他東西,例如圖片、視頻等等。
    Redis除key/value之外,還支持list,set,sorted set,hash等衆多數據結構。也可以在服務器端直接對數據進行豐富的操作,這樣可以減少網絡IO次數和數據體積。

  8. 應用場景:
    Memcached:動態系統中減輕數據庫負載,提升性能;做緩存,適合多讀少寫,大數據量的情況(如人人網大量查詢用戶信息、好友信息、文章信息等)。
    Redis:適用於對讀寫效率要求都很高,數據處理業務複雜和對安全性要求較高的系統(如新浪微博的計數和微博發佈部分系統,對數據安全性、讀寫要求都很高)。

  9. 關於不同語言的客戶端支持
    在不同語言的客戶端方面,Memcached和Redis都有豐富的第三方客戶端可供選擇,不過因爲Memcached發展的時間更久一些,目前看在客戶端支持方面,Memcached的很多客戶端更加成熟穩定,而Redis由於其協議本身就比Memcached複雜,加上作者不斷增加新的功能等,對應第三方客戶端跟進速度可能會趕不上,有時可能需要自己在第三方客戶端基礎上做些修改才能更好的使用。

  10. 應用舉例
    memcache:Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提供動態、數據庫驅動網站的速度,現在已被LiveJournal、hatena、Facebook、Vox、LiveJournal等公司所使用。
    redis:國內像新浪、淘寶,國外像 Flickr、Github等均在使用Redis的緩存服務。

    對於兩者的選擇還是要看具體的應用場景,如果需要緩存的數據只是key-value這樣簡單的結構時,我在項目裏還是採用memcache,它也足夠的穩定可靠。如果涉及到存儲,排序等一系列複雜的操作時,毫無疑問選擇redis。
    有持久化需求或者對數據結構和處理有高級要求的應用,只能選擇redis,其他簡單的key/value存儲,選擇memcache。

應該說Memcached和Redis都能很好的滿足解決我們的問題,它們性能都很高,總的來說,可以把Redis理解爲是對Memcached的拓展,是更加重量級的實現,提供了更多更強大的功能。

需要慎重考慮的部分
1.Memcached單個key-value大小有限,一個value最大隻支持1MB,而Redis最大支持512MB
2.Memcached只是個內存緩存,對可靠性無要求;而Redis更傾向於內存數據庫,因此對對可靠性方面要求比較高
3.從本質上講,Memcached只是一個單一key-value內存Cache;而Redis則是一個數據結構內存數據庫,支持五種數據類型,因此Redis除單純緩存作用外,還可以處理一些簡單的邏輯運算,Redis不僅可以緩存,而且還可以作爲數據庫用
4.新版本(3.0)的Redis是指集羣分佈式,也就是說集羣本身均衡客戶端請求,各個節點可以交流,可拓展行、可維護性更強大。

參考鏈接:
https://blog.csdn.net/chaoluo001/article/details/70740307
https://www.cnblogs.com/EE-NovRain/p/3268476.html
https://blog.csdn.net/hhjianlong/article/details/73928653
https://www.cnblogs.com/haoyu521/p/5608309.html
https://www.cnblogs.com/JavaBlackHole/p/7726195.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章