ElastiCacheの2つのエンジン ~RedisとMemcachedについて考える~

はじめに

システム高速化の手法をいくつか調べていくと、インメモリキャッシュ、インメモリデータストアという手法に行き着くかもしれません。

一般的なRDBは、HDDやSSDを使ってデータを読み書きするので、データ量に応じてシークタイムの遅延が発生します。そこでもし、メモリ上でデータの読み書きが出来れば、速度は格段に向上する筈です。

Amazon.comが提供する、クラウドプラットフォームAWS(Amazon Web Service)において、このインメモリキャッシュのサービスに相当するのが、ElastiCacheです。

AWS公式サイトでは、ElastiCacheについて、ミリ秒未満の応答速度を実現させるような要求の厳しいアプリケーション向けという記載があります。

したがって、ElastiCacheについて興味を持つ方は限定されるかもしれません。しかし、ElastiCacheがどのような仕組みで成り立っているのか、知っておいても損は無いはずです。

AWSユーザーは、ElastiCache作成時に、RadisもしくはMemcachedの2つのエンジンのどちらかを選択する事になります。

どちらもインメモリデータストアですが、 Radis はキー・バリュー型NoSQLデータベースなのに対し、MemCachedは分散型インメモリキャッシュです。

上記2つのエンジンについて、それぞれの違いを理解した上で、システムの役割や規模に合わせて選択したほうがよいでしょう。

そこで、ElastiCache利用の為に、まずRadisとMemcachedについて理解を深めて行きたいと思います。

Radisとは

Redisの多様なデータ型

Redisは、キーとバリューを紐付けて管理するNoSQLデータベースです。様々なデータ型を用いて、キーとバリューを保持する為、複雑なデータ管理が可能となります。以下、Redisで利用できるデータ型の一部を列挙します。

  • Strings
  • Lists
  • Sets
  • Sorted Sets
  • Hashes

Strings

文字列をキーとバリューの1対1で保持するシンプルなデータ型です。バイナリセーフである為、画像をバイナリに変換して保存するといった事も出来ます。セッション管理等でもよく用いられます。

値の登録はSETコマンド、取得はGETコマンドで行います。

Lists

キー1つに対し、複数のバリューを紐付けます。Listsは順番を保持しており、重複が許されます。

要素をListの左側(先頭)に追加する場合はLPUSH、右側(末尾)に追加する場合はRPUSHコマンド、値の取得はLRANGEコマンドで行います。

SNSのタイムラインなど日付・時間を管理する場合などによく用いられます。

Sets

重複無しで順序を持たない文字列集合です。値の返却時に順序は保証されません。別のキーで登録されたSetとの和集合や差集合などを求める事が出来ます。

要素の追加はSADD、取得はSMEMBERSコマンドで行います。

SortedSets

キーに紐付いた各値にスコアを定めて、そのスコア値の大小で順序を定めるSetです。

要素の追加はZADD、取得はZLANGEコマンドで行います。

Hashes

重複・順序無しで1つにキーに対し、フィールドと値のペアを紐付ける型です。

1つのHashに登録できるフィールドはメモリ容量の範囲で無制限となります。

要素の追加はHSET、取得はHGETコマンドで行います。

レプリケーションとデータ永続性

Redisはマスターと複数のスレーブで構成する事で、負荷を分散をする事が可能です。また、メモリ上のデータをディスクに保存する事で、停電等の電源消失時にデータを失わずに保存することが出来ます。

Memcachedとは

シンプルなデータ構造

memory cache daemon の略でメムキャッシュディーと読みます。キーとバリューをシンプルな1対1で組み合わせて保存するキーバリューストアです。

RDBとの連携

頻繁に行われるデータベースへの問い合わせ結果を一時的にサーバーのメモリ上にキャッシュしておく事で素早い応答を実現し、データベースの負荷を軽減させる事ができます。

データの保存

データを保存する容量を超えた場合、古い順(LRU)から削除して登録していく仕組みです。また、メモリ上にデータを保存する仕組み上、電源断によってデータは消失します。

スケーラビリティ

複数のサーバーを並列に動作させて、各サーバーにキャッシュを分散したり、負荷に応じてスケールアウト/スケールインに対応しますが、クライアント側で制御する必要があります。

Redis と Memcached どちらを選ぶか?

上記で述べたように、シンプルなデータ構造で、負荷に応じてスケールアウト/スケールインに対応させたいなら、Memcachedを選択する事になるでしょう。

また、複雑なデータ構造と電源消失にも対応させたり、単体のキーバリューストアとしても動作させたいなら、Redisを選択する事になるでしょう。

まとめ

今回はElastiCacheで利用可能なエンジン2つの特徴と違いについて考えてみました。

もし、ElastiCache作成時に迷ってしまう場合は、機能が豊富なRedisを選択するほうが、よいかもしれません。

最後までご覧頂き、ありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です