在BAT做Java分散式開發的時候,少不了要用到緩存,而我也見證了我們的平臺產品從用memcached到轉換為redis。然而,雖然越來越多的人選擇了redis,但是memcached面臨的處境也僅僅是市場佔有率縮水,而不是被徹底淘汰。

這與二者各有不同的優勢有關。

存儲效率

由於redis是單核以及IO復用,所以保證了存儲速度,但是memcached可以使用多核,所以當平均每個核需要存儲的數據小於100K的時候,redis還是性能很優異的,然而超過了這個數值之後,memcached的多核優勢就開始顯露出來了。雖然redis一直也在這方面努力改進,但是目前還是無法超越memcached的。

內存利用率

redis的一個優勢的是支持存儲set,hash,list,string等多種數據格式,而memcached雖然只能存儲key-value格式的數據,但是卻使它的內存利用率更加高。因此,如果你的使用場景用不到redis其餘那麼多的數據格式的話,不妨繼續用memcached。

數據多樣化

memcached除了支持key-value格式的數據,還能存儲圖片,視頻等其他格式的數據,這點是redis望洋興嘆的。因此,對於一些大型網站,比如某美食推薦網站,就可以將一些熱門餐廳的照片等信息存儲在memcached中,從而減少對後臺資料庫的壓力。

分散式擴展

memcached的另一個突出優點就是採用了可分散式擴展的模式,可以將多個memcached組成一個虛擬的服務端,對於調用者來說完全是黑盒的,提高了單機器的內存利用率。雖然redis也有主從機制,但是結合memcached的多核特點,這個特性就更加突出了。

以上是我的淺見,歡迎各位在下方評論區留言點贊。

我是蘇蘇思量,來自BAT的Java開發工程師,每日分享科技類見聞,歡迎關注我,與我共同進步。


兩者雖然有著子集的關係,但不得不說還有存在很多不同,而且彼此不能互相替代。就像有些面試官會問你【為什麼要使用redis】的問題,也是因為有些場合,是根本不需要用到redis,或者說沒必要用到哦。

簡單說,這兩者都是基於內存的數據緩存系統,我認為memcache實現的存儲功能是redis的子集,即memcache能實現的存儲,redis也能做到,但反之則不行。

比如說,memcache只支持簡單的key/value數據結構,但是redis除了String外,還支持list、dict、set、zset、hyperloglog等等數據結構的存儲。

其他的類似redis的持久化、redis的讀寫效率、redis的快照功能,都是比memcache要強大且完善的功能,但為何memcache還是存在,且有很多項目還是使用呢?

其主要的原因,在我看來,是因為場景的需要,比如:

1)項目中使用緩存存儲時,只會對String數據結構進行存儲,但redis在存儲String類型時,會耗費更多的內存,我們需要對數據轉換為dict來進行存儲的壓縮,從而減低內存損耗,在這種情況下,我會優先考慮memcache。

2)redis只支持單線程,其性能受限於CPU性能,即取決於數據結構、數據大小以及伺服器硬體性能,其在日常環節中的QPS高峯約為1-2w,而memcache具有多核優勢,其單實例的吞吐量極高,性能主要取決於存儲的key及value的位元組大小以及伺服器硬體性能,其在日常環節中的QPS高峯約為4-6w。(但有意思的時,即使如此,memcache的性能比起redis,在實際業務中並沒有好多少,但如果看過源碼的人會發現,redis的源碼及其精緻!而memcache的源碼則稍顯臃腫,可能這一塊也會有一定的影響呢?)

總的說:一昧的使用redis來進行數據緩存系統,並不是最佳的選擇,如果項目根本就不需要複雜的數據結構呢?如果項目的數據只有一小部分使用了緩存,根本不需要使用持久化和備份呢?如果項目不需要在伺服器之間進行數據同步呢?在諸如此類情況下,使用redis反而是增加項目成本,殺雞焉用宰牛刀~

——沒事待在家裡不出門的 居家程序員 敲上。(我不想脫髮!)


顯示Memcache和Redis區別介紹:

在Redis中,並不是所有的數據都一直存儲在內存中的,這是和Memcache相比一個最大的區別之一的。

還有這個Redis在很多方面具備資料庫的特徵的,或者說就是一個資料庫系統,而Memcache只是簡單的K/V緩存的。

他們的擴展都需要做集羣;實現方式:master-slave、Hash的。,不過在100k以上的數據中,Memcache性能要高於Redis的。

還有的話如果要說內存使用效率的話,使用簡單的key-value存儲的話,Memcached的內存利用率更高的。

而如果Redis採用hash結構來做key-value存儲的,由於其組合式的壓縮,其內存利用率會高於Memcache。所以當然,這和你的應用場景和數據特性有關的的。

如果你對數據持久化和數據同步有所要求,那麼推薦你選擇Redis的,因為這兩個特性Memcache都不具備的。

所以即使你只是希望在升級或者重啟系統後緩存數據不會丟失的,選擇Redis也是明智的選擇得的。

還有雖然這個Redis和Memcache在寫入性能上面差別不大的,讀取性能上面尤其是批量讀取性能上面Memcache更強的。

以上區別說明:memcache還是有可取之處的!!!

總結一下的::

最後這個Memcache:Memcache可以利用多核優勢的,單實例吞吐量極高的,可以達到幾十萬QPS,適用於最大程度扛量的的。

他的話只支持簡單的key/value數據結構的,不像Redis可以支持豐富的數據類型的。

無法進行持久化,數據不能備份,只能用於緩存使用,而且且重啟後數據全部丟失的。。。。


1.memcached多線程,使用cas對數據加鎖,而redis單線程。因為memcached多線程存在上下文開銷,所以它性能上是比不過redis的。可以參考epoll一個線程處理請求,仍然能夠支持上萬並發(大對象除外,因為會被io拖慢引起阻塞。但互聯網場景基本都是小數據量高並發的)。

2.然後redis數據結構多,還支持lua,各種集羣模式,而且還可以存儲當庫用(雖然會有點小問題)。所以你會發現互聯網公司前臺系統用memcached是越來越少了,甚至我很多年沒看到過了,都是redis。


用哪個內存庫,取決於項目組成員熟悉哪個。強烈推薦Redis。Redis能實現的功能已經遠遠超出了緩存這一區域。Redis可以看作資料庫的元數據。List是資料庫列表。Hash是表項。KEY是索引。利用REDIS可以自己設計一個速度飛快的關係型資料庫。


推薦閱讀:
相關文章