在ElastiCache中,是否应选择Memcached还是Redis?我自己尝试了解一下

这篇文章是2019年12月4日的“Samzap Advent Calendar 2019 #1”活动中的文章。

我在Samzap公司担任工程师经理一职,该公司从事智能手机游戏的规划和运营业务。
在我负责的游戏中,我们使用ElastiCache for Memcached作为数据库查询缓存。
然而,最近我听到了像“Memcached的php库很旧,现在都用Redis了!”之类的言论。
而且,实际上,许多新游戏标题似乎都采用了Redis。

最后哪个更好呢?我对此感到困惑,所以我自己进行了调查和总结。

Memcached和Redis的比较

AWS的官方文档中,有一个简明易懂的比较摘要。

MemcachedRedis (クラスターモードが無効)Redis (クラスターモードが有効)エンジンバージョン1.4.x2.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的存储引擎。
如果数据库是MySQL,那么在查询缓存中也许有这个选项?我也有这样的想法。

明天是 @hiroyuuki 先生的文章。

请看下面的部分提供给你的参考:

Memcached和Redis的比较
在ElastiCache中,应该选择Memcached还是Redis?

广告
将在 10 秒后关闭
bannerAds