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を選択するほうが、よいかもしれません。
最後までご覧頂き、ありがとうございました。