💾

MemcachedとRedisの違い

2022/03/15に公開

概要

業務でRedisを使っているが、Memcachedもよく使われているインメモリデータベースであることを知り、Redisと比較してどう違うのか、何が良いのかを調べた備忘です。

前提

インメモリデータベースとは

データをメインメモリ上に格納するよう設計されたデータベース。
ストレージに格納されるデータベースとは、主にその格納先が異なる。

何が嬉しいのか

データベースへの問い合わせ結果をキャッシュするので、データベースへのアクセス回数を減らし、アプリケーションの高速化やスケーラビリティの向上ができる。

Memcachedとは

分散型キーバリューインメモリデータストレージシステムで、当初はPerlで開発され、その後C言語に書き換えられた。Youtube、Facebook,Shopify,Pinterestなどが使用している。

Redisとは

同じく分散型キーバリューインメモリデータストレージシステムで、Remote Dictionary Serverの略。最初のプロトタイプはTclで書かれ、その後C言語に書き換えられた。Twitter、GitHub、Pinterest、Snapchat、StackOverflowなどが使用している。

共通しているところ

  • OSS
  • 低レイテンシー
  • 多くのオープンソースクライアントがある。
    • Java、Python、PHP、C、C++、C#、JavaScript、Node.js、Ruby、Goなど。
  • 複数ノードにデータを分散可能。
  • 古いデータを捨てるタイミングを指定できる。

異なるところ

データ構造

Memcachedは、データ型を持たないため、文字列を文字列キーでインデックスして保存している。オーバーヘッドメモリが少ない。(Redisと比べて)
一方RedisはMemcachedと違って、String、List、Set、Sorted Set、Hash、Bit Array、HyperLogLogをサポートしており、複数のデータ型操作に対応している。

Memcachedだと、そのデータを変更する場合、文字列をロードしてデシリアライズし、オブジェクトフィールドを編集してシリアライズして保存する必要があるが、RedisはHash型が使えるため、その各フィールドに個別にアクセスし、変更を加えることができる。そのため、ネットワークI/O回数とデータサイズを減らすことでケースシナリオを高速化することができる。

key・valueの最大サイズ

Memcachedは、最大250Bのkey、最大1MBのvalueをサポート。
Redisは、ListとSet型に関しては、key・valueどちらも最大512MBをサポートしている。(その他の型については不明)

スケーリング

Memcachedはマルチスレッドのため、スケーリングが簡単。スケールするのに必要なのは、より多くのコアとより多くのメモリー。
Redisは、シングルスレッド。マスター/スレーブアーキテクチャで動作している。マスターに障害が発生すると、自動的にスレーブを新しいマスターとして昇格させる。

永続化

Memcachedは、そもそも永続化できる手段を持たないが、Redisは、AOFログや、スナップショットを取ることができるため、データセットを復元できる。(ニアリーイコール 永続化としているみたい)

まとめ

どちらを採用するかは、プロジェクトや要件によって異なる。
保存するデータの種類によって、データ型操作が有利になることがあればRedisを採用するし、
スケールさせておきたい場合や、オーバーヘッドメモリを抑えたい場合はMemcachedを採用するといった感じと理解。(AWS ElastiCacheを活用すれば、Redisもスケールできそうだけどね。)

その他調べたこと

MemcachedとRedis以外で代表的なインメモリデータベース製品は、下記の通り。

参考元

Discussion