本記事は、サムザップ Advent Calendar 2019 #1 の12/4の記事です。
スマホゲームの企画・運営事業を行っているサムザップで、エンジニアマネージャーをしています北島です。
私の担当しているゲームでは、DBのクエリーキャッシュとして ElastiCache for Memcached を使っています。
ですが、最近は「Memcachedのphp libraryは古いし、今はRedisだよね!」といったような話を聞くような気がします
また、実際に新しいゲームタイトルではRedisを採用している所が多いような気もします。
結局のところどっちが良いの?と疑問に思ったので、自分なりに調べてまとめてみました。
#MemcachedとRedisの比較
AWSの公式ドキュメントに分かりやすく比較がまとまっています。
Memcached | Redis (クラスターモードが無効) | Redis (クラスターモードが有効) | |
---|---|---|---|
エンジンバージョン | 1.4.x | 2.8.x 以降 | 3.2.x 以降 |
データ型 | シンプル ‡ | 2.8.x - 混在 * | 3.2.x 以降 - 複雑 |
複雑 | |||
データのパーティション化 | あり | いいえ | あり |
クラスターが変更可能 | あり | あり | 3.2.10 以降 - 限定 |
オンラインリシャーディング | なし | なし | 3.2.10 以降 |
暗号化 | なし | 3.2.6、4.0.10 以降 | 3.2.6、4.0.10 以降 |
コンプライアンス認定 | |||
コンプライアンス認定 FedRAMP HIPAA PCI DSS |
なし いいえ いいえ |
3.2.6、4.0.10 以降 3.2.6、4.0.10 以降 3.2.6、4.0.10 以降 |
3.2.6、4.0.10 以降 3.2.6、4.0.10 以降 3.2.6、4.0.10 以降 |
マルチスレッド | あり | いいえ | なし |
ノードタイプのアップグレード | なし | はい | なし |
エンジンのアップグレード | はい | はい | あり |
高可用性 (レプリケーション) | なし | はい | あり |
自動フェイルオーバー | なし | オプション | 必須 |
パブリック/サブ機能 | なし | はい | あり |
ソートされたセット | なし | はい | あり |
バックアップと復元 | なし | はい | あり |
地理空間インデックス作成 | なし | 2.8.x - いいえ | あり |
3.2.x 以降 - あり | |||
注: | |||
‡文字列、オブジェクト (データベースなど) | |||
*文字列セット、並べ替えられたセット、リスト、ハッシュ、ビットマップ、Hyperloglog | |||
‡文字列、セット、ソートされたセット、リスト、ハッシュ、ビットマップ、hyperloglog、地理空間インデックス |
#自分なりの考えのまとめ
自分なりの考えを以下にまとめます。
あくまでも私個人の意見として見てください。
- パフォーマンス・費用面は大差はない
- Memcachedの方が速いというイメージがあるが、最近は単純なget/setであれば大差はないらしい
- 費用面もキャッシュ的な使い方であれば大差はなさそう
- 可用性ではRedis
- Memcachedの場合、ある程度大きいコア・スレッド数のノードを用意することになる
- そして、そのノードを追加したり削除したりすることで負荷分散をする
- これらのノードの組み合わせをクラスターとして管理する
- Redisの場合、クラスターモードの有効/無効、シャード有効/無効など、様々な構成ができる
- よって、Redisの方が可用性では優れていそう
- とはいえ、クエリーキャッシュなどの単純な構成で良い用途であればMemcachedでも良さそう
- 機能性ではRedis
- Memcachedは単純なデータ型(string)しかない
- RedisはListやHash、Sorted Setなど様々なデータ型がある
- また、正規表現でキーの曖昧検索ができるのも便利
- さらに、Redisはクラスター毎にスナップショットを取ることもできる
- 単一ノードの性能ではMemcached
- Memcachedはマルチスレッドなので、CPUのコア数を上げれば上げるほど性能は上がる
- Redisはシングルスレッドなので、CPUのコア数を上げてもパフォーマンスの向上はそこまで期待できない
- とはいえ、キャッシュ的な使い方であれば、単一ノードの性能がボトルネックになることはあまりない気はする
- 運用・保守のしやすさではMemcached
- Memcachedの最新バージョンは 1.5.16
- Redisの最新バージョンは 5.0.5
- RedisはMemcachedに比べ、機能が複雑な分、頻繁に更新が入っている
- 更新することも考え、運用・保守の観点では、Memcachedの方が楽そうではある
- 個人的なイメージだが、更新が少ないことや用途が違うこから、Memcachedの方が問題が起きにくいイメージもある
#最後に
今回は、ElastiCacheにおけるMemcachedとRedisの比較をまとめました。
あくまでも私の考えですが、使用用途が決まっていて単純なものであればMemcached。
複雑もしくは複雑になる恐れがる場合は、Redisといった感じでしょうか。
今回の件とは関係がありませんが、MySQLのエンジンにMEMORY ストレージエンジンというのもありますね。
DBがMySQLであるならば、そのクエリーキャッシュでこの選択肢もありなのかも?と思ったりもします。
明日は、@hiroyuuki さんの記事です。
#参考