天天看點

全網最權威!Redis官方對比分布式緩存Redis V.S Memcached1 不應該太在意的次元2 應該在意的次元3 開發前的考量4 總結

在分布式系統開發中,系統與系統之間都屬于程序級别,緩存系統也能跨程序叫分布式緩存,市面上分布式緩存技術有 Memcached 和 Redis。

性能上都很出色,具體到細節,由于 Redis 隻使用單核,而 Memcached 可以使用多核,是以平均每一個核上 Redis 在存儲小資料時比 Memcached 性能更高。

而在 100K 以上的資料中,Memcached 性能要高于 Redis,雖然 Redis 最近也在存儲大資料的性能上進行優化,但是比起 Memcached,還是稍有遜色。

MemCached 可以修改最大記憶體,采用 LRU 算法。Redis 增加了 VM 的特性,突破了實體記憶體的限制。

MemCached 資料結構單一,僅用來緩存資料,而 Redis 支援更加豐富的資料類型,也可以在伺服器端直接對資料進行豐富的操作, 這樣可以減少網絡 IO 次數和資料體積。

1 不應該太在意的次元

1.1 性能

  • 平均到單核的性能,在單條資料不大時,Redis更快。以前因為Redis是單線程的,隻能使用一個核。而Memcached是多線程的,是以對一個執行個體來說,性能上肯定是Memcached占優勢。但現在Redis 6.x 已經支援多線程,Redis 在這點也沒劣勢了。

memcached可通過單個可執行檔案和TCP端口使用多個核心,而無需用戶端的幫助的多線程、非阻塞 IO 模式。memcached可以更快地獲得大約100k的大值資料。Redis最近對大值(不穩定的分支)進行了很多改進,但是在這種場景下,memcached仍然更快(不過這個回答已經是很多年前了,現在優化的應該也沒劣勢了)。

這裡的重點是:任何一個查詢都不應該成為它們每秒可以提供的查詢的瓶頸。

2 應該在意的次元

2.1 記憶體使用率

  • 對于簡單的鍵/值對,memcached的記憶體使用率更高。
  • 而如果Redis采用hash結構存儲鍵/值對,由于其組合式的壓縮,其記憶體使用率會高于Memcached。

2.2 持久化和複制(可靠性)

MemCached 不支援資料持久化,斷電或重新開機後資料消失,是以隻能作為緩存使用,但其穩定性是有保證的。

Redis 支援資料持久化和資料恢複,允許單點故障,但是同時也會付出性能的代價。這樣啟動更快,不需要從關系資料庫加載資料,從自己的 dump 檔案加載即可。

Memcached都不支援。

僅在Redis中可用的兩個功能。即使你的目标是建立緩存,它也可以幫助你在更新或重新開機後仍然保留資料。

2.3 所需的資料類型

  • Memcached是一個記憶體中鍵值存儲,用于存儲來自資料庫調用,API調用或頁面呈現結果的小資料塊(字元串、對象)。通常需要将資料拿到用戶端(即隻能在用戶端完成計算)來進行類似的修改再set回去,這大大增加了網絡I/O的次數和資料大小。
  • 在Redis中,提供更多複雜的資料類型,是以也能支援更多應用場景。即使僅考慮緩存場景,通常也可以在單個操作中完成更多操作,而無需在用戶端處理資料(即Redis支援伺服器端資料計算),該操作通常和普通的GET和SET一樣快。是以,如果你不僅需要GET / SET,還需要更複雜的功能,則Redis可以提供很大幫助(請考慮使用時間軸緩存)。

2.4 叢集模式

  • memcached沒有原生的叢集模式,需要依靠用戶端來實作往叢集中分片寫入資料
  • 但是redis目前是原生支援cluster模式的,redis官方就是支援redis cluster叢集模式的,比memcached來說要更好

2.5 應用場景

Memcached:動态系統中減輕資料庫負載,提升性能;做緩存,适合多讀少寫。

Redis:适用于對讀寫效率要求都很高,資料處理業務複雜和對安全性要求較高的系統。

3 開發前的考量

  • Memcached 單個 KV 大小有限,一個 V 最大隻支援 1M,而 Redis 最大支援 512M。
  • Memcached 隻做緩存,對可靠性無要求;而 Redis 更傾向于記憶體資料庫,是以對對可靠性方面要求比較高
  • Memcached 隻是個單一 KV 緩存;而 Redis 則是一個資料結構記憶體資料庫,支援多種資料類型,是以 Redis 除單純緩存作用外,還可以處理一些簡單的邏輯運算,Redis 不僅可以緩存,而且還可以作為資料庫用

Redis 還可叢集分布式,即叢集本身均衡用戶端請求,各個節點可以交流,可拓展行、可維護性更強大。而 Memcached 的叢集則需通過第三方才能搭建

4 總結

沒有場景,就難以選型,但Redis在很多事情上都是有意義的,因為即使你不想将其用作資料庫,也可以通過使用更多功能來解決更多問題,不隻是緩存,甚至是消息隊列,排名等。

參考