RedisはREの略です モテDI ctary S erver、2009年にサルヴァトーレサンフィリッポによって作成されました。一方、Memcachedは、2003年にBradFitzpatrickによって作成されました。 RedisとMemcachedはどちらも次のとおりです。
- NoSQLのメモリ内データ構造
- Cで書かれた
- オープンソース
- アプリケーションを高速化するために使用されます
- ミリ秒未満のレイテンシをサポート
2014年、Salvatoreは、RedisよりもMemcachedを使用する方が理にかなっている場合に優れたStackOverflowの投稿を書きました。この投稿では、RedisとMemcachedの現在の詳細な比較を提供し、アプリケーションでの使用について情報に基づいた選択を行えるようにします。
インフォグラフィック
この投稿は、以下のインフォグラフィックに要約されています。このインフォグラフィックを使用すると、この比較の結果を簡単に視覚化して、さまざまなシナリオでどちらが一番上に表示されるかを確認できます。比較をテキスト形式で読みたい場合は、ここをクリックしてください。
ドキュメント
まず、RedisはMemcachedよりもはるかに包括的に文書化されています。これにより、学習、管理、使用が容易になります。
データベースモデル
Redisは主にKeyValueストアです。キーはバイナリ文字列ですが、Redisの利点は、値がバイナリ文字列だけに制限されないことです。それらは、複雑なオブジェクトの格納を可能にし、それらに対して豊富な操作のセットを提供するさまざまなデータ構造にすることができます。 Redisは、Redisモジュールを介した拡張性も提供します。 Redisモジュールは、コア機能セット内では利用できない追加のデータ構造と機能を提供する拡張機能です。モジュールとして利用できるようになったいくつかの機能のサンプルを次に示します。
- ドキュメントストア
- グラフDBMS
- 検索エンジン
- 時系列DBMS
Memcachedは、値としてバイナリ文字列のみをサポートするプレーンなキー値ストアです。
データ構造
前述のように、Redisは、文字列、ハッシュ、リスト、セット、並べ替えられたセット、ビットマップ、ビットフィールド、HyperLogLogなど、非常に柔軟に使用できる複数のデータ構造タイプを提供します。地理空間インデックス、およびストリーム。これらの詳細については、コアデータ構造タイプ別のトップRedisユースケースの記事をご覧ください。
画像ソース:https://redislabs.com/redis-enterprise/data-structures/
Memcachedは、読み取り専用データに最適なプレーンなバイナリ文字列のみをサポートしているため、Redisのすべての機能が必要ない場合は、Memcachedがよりシンプルなデータベースになります。使用します。
データベースのランクと人気
データベースの人気が高まると、ユーザーコミュニティが拡大し、ディスカッションやユーザー生成チュートリアルが増え、DBaaSプラットフォームやDBaaSプラットフォームなどのサードパーティツールを介したヘルプとサポートが増えます。展開を最適化するのに役立つ分析ツール。
DB-Enginesによると、Redisは、そのシンプルさ、豊富なデータ構造、優れたドキュメントにより、2021年2月の時点で世界で8番目に人気のあるデータベースです。 Memcachedは、現在28番目に人気のあるデータベースとしてランク付けされています。キー値データベースモデルに関してRedisとMemcachedがランク付けされている場合、Redisが1位、Memcachedが4位になります。ただし、オープンソースのKey-Valueデータベースのみ、またはオンプレミスでデプロイできるデータベースを探している場合は、AmazonDynamoDBとMicrosoftAzure Cosmos DBの両方が商用データベースであり、クラウド。
アーキテクチャ
RedisとMemcachedはどちらもclient-serverに従います 建築。クライアントは、キー値の形式でサーバーにデータを入力します。
Redisはシングルスレッドですが、Memcachedはマルチスレッドアーキテクチャです。 Memcachedは、計算能力がスケーリングされた場合に、より多くの操作を処理できるコアが多いシステムでより適切にスケーリングされます。ただし、同じシステムで複数のRedisインスタンスを開始して、追加のコアを利用することができます。
使いやすさ
上記のデータベースモデルのセクションで説明したように、マルチモデルデータベースであるRedisは、あらゆるタイプのデータモデルで使用できます。 Redisでは、複雑なタスクを簡素化するため、コードを簡単に記述できます。 Redisは高度なデータ構造を備えており、単純な文字列値に限定されません。たとえば、アプリケーションがデータをセットに保存し、リスト内のセットを追跡したい場合は、Redisでこれを簡単に行うことができます。 Memcachedで同様のタスクを実行することはできません。ただし、同じタスクを実行する方法は他にもあり、より多くのコード行が必要になります。
一方、Memcachedは、プレーンな文字列値のみを格納します。したがって、アプリケーションはデータ構造の複雑さに対処する必要があります。
データ分割
Redisは、複数のノードインスタンス間でのデータの分割をサポートしています。 Redisの現在のユーザーは、範囲分割、ハッシュ分割、データ分割のためのコンシステントハッシュなどのさまざまな手法を活用しています。 Redisでは、データ分割は3つの異なる方法で実装できます。
- クライアント側のパーティショニング
- プロキシ支援パーティショニング(例:twemproxy)
- クラスターノード内でのクエリルーティングを使用したサーバー側のパーティショニング
Memcachedは複数のノード間でのデータ分割もサポートしており、トラフィックの負荷が均等に分散されるようにするには、コンシステントハッシュ法をお勧めします。
RedisとMemcached-2021の比較クリックしてツイートサポートされている言語
Redisは、高水準言語から低水準言語まで、最も使用されているプログラミング言語のほとんどすべてをサポートしています。ただし、MemcachedはRedisに比べてサポートする言語の数は少なくなりますが、一般的なすべての言語をサポートします。
Memcached
- .Net
- C
- C ++
- ColdFusion
- アーラン
- Java
- Lisp
- ルア
- OCaml
- Perl
- PHP
- Python
- ルビー
Redis
- C
- C#
- C ++
- Clojure
- クリスタル
- D
- ダーツ
- エリクサー
- アーラン
- ファンシー
- 行く
- ハスケル
- Haxe
- Java
- JavaScript(Node.js)
- Lisp
- ルア
- MatLab
- Objective-C
- OCaml
- パスカル
- Perl
- PHP
- プロローグ
- 純粋なデータ
- Python
- R
- Rebol
- ルビー
- さび
- スカラ
- スキーム
- Smalltalk
- スウィフト
- Tcl
- ビジュアルベーシック
トランザクション
Redisの「トランザクション」は、以下の3つの保証付きで実行されます。
- トランザクションはシリアル化され、順番に実行されます
- すべてのコマンドが処理されるか、まったく処理されない(アトミックトランザクション)
- オプティミスティックロックは、チェックアンドセットを使用した追加の保証を提供します
Redisは、1台のクライアントマシンからの1つのコマンドだけが一度に実行されるようにします。原子性を確保するために「EXEC」コマンドが呼び出されると、トランザクション内のすべてのコマンドが実行されます。
一方、Memcachedは、トランザクション管理を提供しません。
複製
Redisは、次の機能を備えた、マスターインスタンスの正確なコピーを作成する単純なリーダーフォロワー(マスタースレーブ)レプリケーションを提供します。
- マスターは、スレーブが接続されている限り、データコマンドをスレーブに送信し続けます。
- 接続が切断された場合、スレーブは部分的な再同期に従い、切断中に失われたデータのみをコピーします。
- 部分的な再同期が不可能な場合は、完全な再同期が試行されます。
高可用性機能であるRedisSentinelsまたはRedisClusterを活用して、高度なフェイルオーバー保護を実現することもできます。
Native Memcachedはレプリケーションをサポートしていませんが、無料のオープンソースパッチであるRepcachedを使用して、デプロイの高可用性を実現できます。マルチマスターレプリケーション、非同期データレプリケーションを提供し、すべてのMemcachedコマンドをサポートします。
スナップショット/永続性
スナップショットは、特定の時点でのデータベースの読み取り専用ビューです。 Redisはスナップショットをサポートしており、デフォルトでは、Redisはデータセットのスナップショットをdump.rdbというバイナリファイルにディスクに保存します。スナップショットを手動で呼び出すか、操作を実行するための頻度をカスタマイズしたり、しきい値を変更したりできます。
Redisがサポートする2つの永続性オプションは次のとおりです。
- RDBの永続性
- AOFの永続性
RDBは「Redisデータベースバックアップ」の略です。これは、特定の時間におけるデータベースのコンパクトな特定時点のスナップショットです。占有するスペースが少なく、Redisのパフォーマンスが最大化され、ディザスタリカバリに適しています。
AOFは「ファイルのみを追加」の略です。 AOFは、実行されたすべてのコマンドを追跡し、悲惨な状況では、データを取り戻すためにコマンドを再実行します。この方法は、すべてのコマンドが再度実行されるため、より多くのスペースを必要とし、スナップショットの耐久性の高い方法ではありません。
一方、Memcachedはディスクの永続性をサポートしていません。
サーバーサイドスクリプト
Luaは、Redisサーバーに組み込まれたスクリプト言語であり、バージョン2.6から利用できます。これにより、Redis内で操作を実行して、コードを簡素化し、パフォーマンスを向上させることができます。 Luaインタープリターを使用してスクリプトを評価するために使用される2つの主な関数は次のとおりです。
- 評価
- EVALSHA
Luaスクリプトが実行されているとき、下の図に示すように、他のすべてのリクエストはブロックされます。
Redisにはバージョン3.2のLuaスクリプトデバッガーも含まれています。これにより、複雑なスクリプトの記述が容易になり、パフォーマンスが向上します。
Memcachedはサーバーサイドスクリプトをサポートしていません。
スケーラビリティ
Redisデータベースを水平方向にスケーリングする方法は2つあります。
- Redisクラスターにシャードを追加する
- Redis HA(マスター/レプリカ)セットアップへのノードの追加
より多くのメモリや計算が必要な場合は、Redisセットアップを垂直方向にスケーリングすることもできます。 HAをセットアップしている場合、またはRedis Clusterテクノロジーを使用している場合は、ダウンタイムなしで実行できます。
Memcachedサーバーは、ノード間でデータを分散するメカニズム(シャーディング)を提供していません。そのため、Memcachedでは、水平方向のスケーラビリティはノードを追加するのと同じくらい簡単です。データを異なるシャードに分割する問題は、アプリケーション/クライアントレベルで実行する必要があります。これに役立つオープンソースツールがいくつかあります。
通信プロトコル
RedisはネットワークプロトコルとしてTCPを使用し、UDPをサポートしていません。
Memcachedは、TCP通信プロトコルとUDP通信プロトコルの両方をサポートしています。データは2つの形式でMemcachedサーバーに送信されます:
- テキスト行:コマンドを送信し、サーバーから応答を受信します。
- 非構造化データ:特定のキーの値情報を送受信し、データは提供されたものと同じ形式で返されます。
サポートされているキャッシュ排除ポリシー
Redisはさまざまなタイプのエビクションポリシーをサポートしています。いくつか見てみましょう。
- noeviction: 「noeviction」では、メモリがバインドに達するとエラーが返されます。
- allkeys-lru: Lruは、「最も最近使用されていない」の略です。このポリシーは、最も使用頻度の低いデータを削除します。
- allkeys-lfu: Lfuは、「最も使用頻度の低い」の略です。このポリシーは、最も使用頻度の低いデータを削除します。
- allkeys-random: このポリシーはデータをランダムに削除します。
- volatile-lru: 揮発性データには有効期限データセットが含まれます。このポリシーは、最も最近使用されていない揮発性データを削除します。
- volatile-lfu: 揮発性データには有効期限データセットが含まれます。このポリシーは、最も使用頻度の低い揮発性データを削除します。
- volatile-random: このポリシーは、揮発性データをランダムに削除します。
- volatile-ttl: 「TTL」は存続時間の略です。このポリシーにより、存続時間が最短のデータが削除されます。
Memcachedは、スペースが必要な場合にLRUアルゴリズムを使用してデータを削除します。期限切れのデータが利用できない場合は、最初にすでに期限切れのデータを検索して削除します。LRUアルゴリズムが使用されます。
メッセージングのパブリッシュ/サブスクライブ
RedisはPub/ Subメッセージング(パブリッシュおよびサブスクライブ)をサポートしています。この目的で使用されるコマンドは3つあります。
クライアントが使用するもの:
- 購読
- 登録解除
登録と登録解除は、特定のチャネルからメッセージを取得するために使用されます。
サーバーは以下を使用します:
- 公開
「公開」は、データをクライアントにプッシュするために使用されます。
Memcachedはパブリッシュおよびサブスクライブメッセージングをサポートしていません。
ストリームのサポート
Redisは、新しいデータ構造「Redis Streams」を使用して、5.0以降のバージョンのKafkaのようなストリームをサポートします。 Redis Streamsには、Apache Kafkaのようなコンシューマーグループの概念があり、クライアントアプリケーションがメッセージを分散して消費できるようにすることで、拡張と高可用性システムの作成を容易にします。
Memcachedはストリームのネイティブサポートを提供していませんが、低レイテンシでのストリーム処理のためのKafcacheのようなオープンソースライブラリツールがあります。
地理空間サポート
Redisには、場所の経度と緯度のデータを格納する地理空間インデックスと呼ばれるデータ構造があります。 2点間の距離の計算や近くの場所の検索など、地理空間データに対してさまざまな操作を実行できます。
Memcachedには、地理空間データを処理するための特別なデータ構造はありません。
パフォーマンス
メモリ内のキー値データストア間のパフォーマンスの比較は、実際に重要なことよりも知的演習です。ただし、これが次のように興味深い規模でシステムを展開している場合を除きます。コスト削減策。これは、このようなストアはIOバウンドであり、通常、ネットワークレイテンシは、データベースのレイテンシよりもアプリケーションが認識するレイテンシに大きな役割を果たす可能性があるためです。
より実用的なパフォーマンスの側面は、ストレージ効率、つまり同じ量のメモリにパックできるデータの量です。ここでも、Redisが使用する内部データ構造はデータサイズによって異なります。したがって、これらのデータベース間のパフォーマンスに関する議論は、ほんの少しの塩で行う必要があります。
2016年の研究論文に示されているいくつかの比較を見てみましょう。このホワイトペーパーでは、著者は広く使用されているインメモリデータベースを実験して、次の観点からパフォーマンスを測定します。
- 操作を完了するのにかかる時間。
- 操作中にメモリをどれだけ効率的に使用するか。
このペーパーで使用されているデータベースのバージョン:
データベース | バージョン |
---|---|
Redis | 3.0.7 |
Memcached | 1.4.14 |
書き込み操作
ご覧のとおり、データの書き込み中、Memcachedは、レコード数が100万に達した後でも、並外れた速度を示しています。
キーと値のペアを書き込むための計算時間(ms)
レコード数 | ||||
---|---|---|---|---|
データベース | 1,000 | 10,000 | 100,000 | 1,000,000 |
Redis | 34 | 214 | 1,666 | 14,638 |
Memcached | 23 | 100 | 276 | 2,813 |
読み取り操作
Redisでは100万レコードでもデータの読み取りはほぼ一貫していますが、Memcachedではレコード数が増えるにつれて時間も少し長くなります。
データベースごとに特定のキーに対応する値を読み取るまでの経過時間(ミリ秒)
レコード数 | ||||
---|---|---|---|---|
データベース | 1,000 | 10,000 | 100,000 | 1,000,000 |
Redis | 8 | 6 | 8 | 8 |
Memcached | 9 | 14 | 14 | 30 |
メモリ使用
メモリ使用量について話し合っている間、結果からわかるように、Redisが常に最適です。
書き込み操作(MB)用のインメモリデータベースのメモリ使用量
レコード数 | ||||
---|---|---|---|---|
データベース | 1,000 | 10,000 | 100,000 | 1,000,000 |
Redis | 2.5 | 3.8 | 4.3 | 62.7 |
Memcached | 5.3 | 27.2 | 211 | 264.9 |
ご覧のとおり、RedisはMemcachedよりも優れています。
削除操作(MB)用のインメモリデータベースのメモリ使用量
レコード数 | ||||
---|---|---|---|---|
データベース | 1,000 | 10,000 | 100,000 | 1,000,000 |
Redis | 0 | 0 | 0 | 0 |
Memcached | 2.2 | 2.1 | 2.2 | 2.2 |
マネージドサービス/サポート
Redisの人気とコミュニティの高まりにより、マネージドサービス、ホスティング、サポートの必要性も高まっています。 Redis™*の一般的なマネージドデータベースプロバイダーには、ScaleGrid、Redis Labs、AWS Elasticache、Azure Cache、DigitalOceanが含まれます。このページでは、Redis™のトッププロバイダーの優れた比較を提供します。 Redisには、キャッシュヒット、メモリ使用量、操作、さらには低速のクエリログなどの広範な内部レポートツールもあります。
Memcachedのマネージドサービスははるかに利用できませんが、AmazonElasticacheを通じて引き続きサポートされています。
トランスポート層セキュリティ(TLS)のサポート
Redisは、Redis6.0以降のネイティブTLSをサポートしています。以前のバージョンのRedisは、TLSサポートを提供するためにstunnelの使用を推奨していました。
Memcached 1.5.13以降のバージョンは、TLSを介した認証と暗号化をサポートしています。この機能はまだ実験段階です。
認証
Redis 5.xまで、Redisは単純なパスワードベースの認証のみをサポートしていました。このパスワードは、サーバーにプレーンテキストで保存されていました。バージョン6.0以降のRedisは、フル機能のACLをサポートしています。
Memcachedバージョン1.4.3以降では、SASLがサポートされています。以前は、Memcachedには認証レイヤーがありませんでした。
概要
RedisとMemcachedはどちらも優れており、さまざまな分野でアプリケーションがあります。後で開発されるRedisには多くの高度な機能があり、優れたドキュメントとコミュニティがあります。
|
*RedisはRedisLabsLtdの商標です。その中の権利は、Redis Labs Ltdに帰属します。ScaleGridによる使用は、参照のみを目的としており、スポンサーシップ、承認を示すものではありません。またはRedisとScaleGridの提携。