memcache和redis是互聯網分層架構中,最常用的KV緩存。不少同學在選型的時候會糾結,到底是選擇memcache還是redis。
畫外音:不鼓勵粗暴的實踐,例如“memcache提供的功能是redis提供的功能的子集,不用想太多,選redis準沒錯”。
雖然redis比memcache更晚出來,且功能確實也更豐富,但對于一個技術人,了解“所以然”恐怕比“選擇誰”更重要一些。
什么時候傾向于選擇redis?
業務需求決定技術選型,當業務有這樣一些特點的時候,選擇redis會更加適合。
復雜數據結構
value是哈希,列表,集合,有序集合這類復雜的數據結構時,會選擇redis,因為mc無法滿足這些需求。
最典型的場景,用戶訂單列表,用戶消息,帖子評論列表等。
持久化
mc無法滿足持久化的需求,只得選擇redis。
但是,這里要提醒的是,真的使用對了redis的持久化功能么?
千萬不要把redis當作數據庫用:
redis的定期快照不能保證數據不丟失
redis的AOF會降低效率,并且不能支持太大的數據量
不要期望redis做固化存儲會比mysql做得好,不同的工具做各自擅長的事情,把redis當作數據庫用,這樣的設計八成是錯誤的。
緩存場景,開啟固化功能,有什么利弊?
如果只是緩存場景,數據存放在數據庫,緩存在redis,此時如果開啟固化功能:
優點是,redis掛了再重啟,內存里能夠快速恢復熱數據,不會瞬時將壓力壓到數據庫上,沒有一個cache預熱的過程。
缺點是,在redis掛了的過程中,如果數據庫中有數據的修改,可能導致redis重啟后,數據庫與redis的數據不一致。
因此,只讀場景,或者允許一些不一致的業務場景,可以嘗試開啟redis的固化功能。
天然高可用
redis天然支持集群功能,可以實現主動復制,讀寫分離。
redis官方也提供了sentinel集群管理工具,能夠實現主從服務監控,故障自動轉移,這一切,對于客戶端都是透明的,無需程序改動,也無需人工介入。
而memcache,要想要實現高可用,需要進行二次開發,例如客戶端的雙讀雙寫,或者服務端的集群同步。
但是,這里要提醒的是,大部分業務場景,緩存真的需要高可用么?
緩存場景,很多時候,是允許cache miss
緩存掛了,很多時候可以通過DB讀取數據
所以,需要認真剖析業務場景,高可用,是否真的是對緩存的主要需求?
畫外音:即時通訊業務中,用戶的在線狀態,就有高可用需求。
存儲的內容比較大
memcache的value存儲,最大為1M,如果存儲的value很大,只能使用redis。
什么時候傾向于memcache?
純KV,數據量非常大,并發量非常大的業務,使用memcache或許更適合。
這要從mc與redis的底層實現機制差異說起。
內存分配
memcache使用預分配內存池的方式管理內存,能夠省去內存分配時間。
redis則是臨時申請空間,可能導致碎片。
從這一點上,mc會更快一些。
虛擬內存使用
memcache把所有的數據存儲在物理內存里。
redis有自己的VM機制,理論上能夠存儲比物理內存更多的數據,當數據超量時,會引發swap,把冷數據刷到磁盤上。
從這一點上,數據量大時,mc會更快一些。
網絡模型
memcache使用非阻塞IO復用模型,redis也是使用非阻塞IO復用模型。
但由于redis還提供一些非KV存儲之外的排序,聚合功能,在執行這些功能時,復雜的CPU計算,會阻塞整個IO調度。
從這一點上,由于redis提供的功能較多,mc會更快一些。
線程模型
memcache使用多線程,主線程監聽,worker子線程接受請求,執行讀寫,這個過程中,可能存在鎖沖突。
redis使用單線程,雖無鎖沖突,但難以利用多核的特性提升整體吞吐量。
從這一點上,mc會快一些。
最后說兩點
1. 代碼可讀性,代碼質量
看過mc和redis的代碼,從可讀性上說,redis是我見過代碼最清爽的軟件,甚至沒有之一,或許簡單是redis設計的初衷,編譯redis甚至不需要configure,不需要依賴第三方庫,一個make就搞定了。
而memcache,可能是考慮了太多的擴展性,多系統的兼容性,代碼不清爽,看起來費勁。
例如網絡IO的部分,redis源碼1-2個文件就搞定了,mc使用了libevent,一個fd傳過來傳過去,又pipe又線程傳遞的,特別容易把人繞暈。
畫外音:理論上,mc只支持kv,而redis支持了這么多功能,mc性能應該高非常多非常多,但實際并非如此,真的可能和代碼質量有關。
2. 水平擴展的支持
不管是mc和redis,服務端集群沒有天然支持水平擴展,需要在客戶端進行分片,這其實對調用方并不友好。如果能服務端集群能夠支持水平擴展,會更完美一些。
猜你喜歡
聯絡方式:
電話:132 5357 1993
郵箱:1069484130@qq.com



-
域名知多少,淺析域名
一、域名的含義域名是Internet網絡上的一個服務器或一個網絡系統的名字,在全世界,沒有重復的域名。域名的形式是以若干個英文字母和數字組成,由"."分隔成幾部分,如baidu.com就是...
-
資深程序猿意見:選redis還是memcache?
memcache和redis是互聯網分層架構中,最常用的KV緩存。不少同學在選型的時候會糾結,到底是選擇memcache還是redis。 畫外音:不鼓勵粗暴的實踐,例如“memcache提供的功能是redis提供的功能的子集,不用想太多,選redis準沒錯”。 雖然redis比memcache更晚出來,且功能確實也更豐富,但對于一個技術人,了解“所以然”恐怕比“選擇誰”更重要一些。 網站開發公司.jpg 什么時候傾向于選擇redis? 業務需求決定技術選型,當業務有這樣一些特...
-
商家揭秘:讓你剁手的19個“潛規則”
很早之前就有一個說法,淘寶是女人的天下,京東是男人的天下,但目前崛起的很多電子商務網站,如聚美優品、蘑菇街、唯品會卻更針對的是女性群體。有的人覺得女性購物好做,有的人覺得...
-
讓新手快速熟悉的四個網站設計技巧
如何吸引用戶點擊停留?是網站設計非常重要的方向,現在就讓小編給大家介紹一定要知道的四個網站設計技巧! 1、網站簡潔又個性的設計 在互聯網絡中4秒就是用戶給網站設計者的展法工夫。用戶的急躁是無限的,網站設計師務必要在無限的工夫內讓用戶加深對網站的記憶和互動。這就務求網站設計師務必要精準、簡潔的轉達出網站最做什么的、網站的性能是什么等用戶想要曉得的信息。 2、網站設計標點符號 網站中的每一個標點符號的設計都有可能吸引到用戶點擊,因而網站設計師在繼續網站設計時定然要準確到標點符號,讓相反...
-
組合域名xagri.cn一口價6.8萬元被秒
近日,在域名市場,有不少含義不錯的域名結拍或被秒,其中一枚手工米xagri.cn以五位數的價格交易!域名xagri.cn以一口價6.8萬元的價格被秒,該域名可以看成字母x和英文agri的組合形成...