memcache和redis是互聯網分層架構中,最常用的KV緩存。不少同學在選型的時候會糾結,到底是選擇memcache還是redis?
memcache提供的功能是redis提供的功能的子集,不用想太多,選redis准沒錯?
redis傾向:
復雜的數據結構:value是哈希,列表,集合,有序集合這類復雜的數據結構時,會選擇redis,因為mc無法滿足這些需求。用戶訂單列表,用戶消息,帖子評論列表等。
持久化: mc無法滿足持久化的需求,只得選擇redis。但是千萬不要把redis真的做數據庫用
a. redis的定期快照不能保證數據不丟失
b.redis的AOF會降低效率,並且不能支持太大的數據量
c.不要期望redis做固化存儲會比mysql做得好,不同的工具做各自擅長的事情
d.redis掛掉重啟后能夠快速恢復熱數據,但是如果着期間有數據修改,可能導致數據不一致,因此,只讀場景,或者允許一些不一致的業務場景,可以嘗試開啟redis的固化功能
自帶高可用集群: redis自身支持集群,實現主從讀寫分離功能,官方也提供sentinal哨兵的集群管理工具,實現主從監控,故障轉移,memcached實現集群需要二次開發了
但是很多時候需要考慮,真的需要高可用么?緩存很多時候是運行cache miss的,cache掛了可以讀db的
存儲的內容比較大 : macache 單個value最大存儲 1M,超過1M只能用redis了。
注意:純的k-v 而且數據量特別大,並發也很大 或許使用memcache更合適
a.內存分配:memcache使用 預分配內存池的煩事管理內存,更節省內存分配時間,redis使用臨時申請的方式,kennel導致碎片。對比看memcache更快一點
b.memcache把所有的數據存儲在物理內存里。redis有自己的VM機制,理論上能夠存儲比物理內存更多的數據,當數據超量時,會引發swap,把冷數據刷到磁盤上。對比看數據量大時,memcache更快一點
c.memcache使用非阻塞IO復用模型,redis也是使用非阻塞IO復用模型,但由於redis還提供一些非KV存儲之外的排序,聚合功能,在執行這些功能時,復雜的CPU計算,會阻塞整個IO調度。從這一點上,由於redis提供的功能較多,mc會更快一些。
d.memcache使用多線程,主線程監聽,worker子線程接受請求,執行讀寫,這個過程中,可能存在鎖沖突。redis使用單線程,雖無鎖沖突,但難以利用多核的特性提升整體吞吐量。從這一點上,mc會快一些。
代碼可讀性,代碼質量:看過mc和redis的代碼,從可讀性上說,redis是我見過代碼最清爽的軟件,甚至沒有之一,或許簡單是redis設計的初衷,編譯redis甚至不需要configure,不需要依賴第三方庫,一個make就搞定了。而memcache,可能是考慮了太多的擴展性,多系統的兼容性,代碼不清爽,看起來費勁。