MemcachedとRedisの違い
概要
業務で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