1. 概要

この記事では、2つの一般的なインメモリデータベースMemcachedRedisの類似点と相違点を検証します。

2. MemcachedとRedis

多くの場合、大量のデータを処理しながらパフォーマンスを向上させるためにキャッシュを検討します。

Memcachedは、使いやすさとシンプルさを考慮して設計された分散メモリキャッシングシステムであり、キャッシュまたはセッションストアとして最適です。

Redisは、豊富な機能セットを提供するメモリ内データ構造ストアです。 キャッシュ、データベース、メッセージブローカー、およびキューとして役立ちます。

3. インストール

3.1. Memcachedのインストール

パッケージをダウンロードしてmakeを実行すると、最新のMemcachedサーバーをインストールできます。

$ wget http://memcached.org/latest
$ tar -zxvf memcached-1.6.3.tar.gz
$ cd memcached-1.6.3
$ ./configure && make && make test && sudo make install

3.2. Redisのインストール

同様に、最新のRedisサーバーをインストールできます。

$ wget http://download.redis.io/releases/redis-5.0.8.tar.gz
$ tar xzf redis-5.0.8.tar.gz
$ cd redis-5.0.8
$ make

4. 類似点

4.1. サブミリ秒のレイテンシ

MemcachedとRedisはどちらも、データをメモリに保持することでミリ秒未満の応答時間を提供します。

4.2. データ分割

同様に、両方のインメモリデータベースでは、複数のノードにデータを分散できます。

4.3. プログラミング言語のサポート

同様に、どちらもJava、Python、JavaScript、C、Rubyを含むすべての主要なプログラミング言語をサポートしています。

さらに、両方のインメモリデータベースで使用できるJavaクライアントがいくつかあります。 たとえば、XmemcachedMemcached-java-clientはMemcachedで使用できますが、 Jedis Lettuce Redisson[ X154X]はRedisで使用できます。

4.4. キャッシュのクリア

Memcachedを使用すると、flush_allコマンドを使用してキャッシュをクリアできます。 同様に、Redisでは、FLUSHDBFLUSHALLなどのコマンドを使用して、キャッシュからすべてを削除できます。

4.5. スケーリング

どちらのキャッシングソリューションも、需要が急激に増加した場合に大規模なデータを処理するための高いスケーラビリティを提供します。

5. 違い

5.1. コマンドライン

Memcachedを使用すると、 telnet:を使用してサーバーに接続することにより、コマンドを実行できます。

$ telnet 10.2.3.4 5678
Trying 10.2.3.4...
Connected to 10.2.3.4.
$ stats
STAT pid 14868
STAT uptime 175931
STAT time 1220540125
// ...

Memcachedとは対照的に、Redisには専用のコマンドラインインターフェイス redis-cli が付属しており、コマンドを実行できます。

$ redis-cli COMMAND
1) 1) "save"
     2) (integer) 1
     3) 1) "admin"
        2) "noscript"
     // ...
2) 1) "multi"
   2) (integer) 1
   3) 1) "noscript"
      2) "fast"
   // ...
3) 1) "geodist"
   2) (integer) -4
   3) 1) "readonly"
   // ...

// ...

ここでは、 COMMAND を実行して、Redisが提供するすべてのコマンドを一覧表示しました。

5.2. ディスクI/Oダンプ

Memcachedは、libmemcached-toolsなどのサードパーティツールまたはmemcached-ddなどのフォークでのみディスクダンプを処理します。

ただし、Redisは、ディスクダンプ用にRDB(Redisデータベースファイル)やAOF(追加専用ファイル)などの高度に構成可能なデフォルトメカニズムを提供します。 これは、アーカイブとリカバリに役立ちます。

redis-cliを使用すると、同期 SAVE コマンドを実行して、メモリ内データのスナップショットを取得できます。

$ redis-cli SAVE
OK

ここで、コマンドはスナップショットを dump.rdb バイナリファイルに保存し、完了するとステータスOKを返します。

ただし、非同期 BGSAVE を実行すると、スナップショットを取得するバックグラウンドプロセスが開始されます。

$ redis-cli BGSAVE
OK

さらに、 LASTSAVE コマンドを使用して、最後に成功したDBスナップショットのUnix時間を確認できます。

$ redis-cli LASTSAVE
(integer) 1410853592

5.3. データ構造

Memcachedは、キーと値のペアを文字列として保存し、値ごとに1MBのサイズ制限があります。 ただし、 Redisは、リスト、セット、ハッシュなどの他のデータ構造もサポートしており、最大512MBの値をサイズに格納できます。

5.4. レプリケーション

Memcachedは、repcachedなどのサードパーティフォークを使用したレプリケーションをサポートしています。

Memcachedとは異なり、Redisは、スケーラビリティと高可用性を向上させるためにプライマリストレージを複製することでクラスターを増やす機能を提供します。

まず、 REPLICAOF Redisマスターサーバーのレプリカを作成するコマンド。 次に、 PSYNC レプリカでコマンドを実行して、マスターからのレプリケーションを開始します。

5.5. トランザクション

Memcachedはトランザクションをサポートしていませんが、その操作はアトミックです。

Redisは、コマンドを実行するためのtransactionのすぐに使えるサポートを提供します。

MULTIコマンドを使用してトランザクションを開始できます。 次に、 EXEC コマンドを使用して、次の後続コマンドを実行できます。 最後に、Redisは、トランザクションの条件付き実行のためにWATCHコマンドを提供します。

5.6. メッセージングのパブリッシュおよびサブスクライブ

Memcachedは、すぐに使用できるパブリッシュ/サブスクライブメッセージングをサポートしていません。

一方、Redisは、パブリッシュおよび pub/subメッセージキューを使用してメッセージをサブスクライブする機能を提供します。

これは、チャットルーム、ソーシャルメディアフィード、サーバー相互通信などのリアルタイム通信を必要とするアプリケーションを設計するときに役立ちます。

Redisには、 PUBLISH、 SUBSCRIBE UNSUBSCRIBE などの専用コマンドが付属しており、メッセージをチャネルに公開し、クライアントを指定されたチャネルにサブスクライブし、サブスクライブ解除します。 。

5.7. 地理空間サポート

地理空間サポートは、アプリケーションにロケーションベースの機能を実装するのに役立ちます。 Memcachedとは異なり、Redisにはリアルタイムの地理空間データを管理するための特別なコマンドが付属しています。

たとえば、 GEODIST コマンドは、2つの地理空間エントリ間の距離を計算します。 同様に、 GEORADIUS コマンドは、指定された半径内のすべてのエントリを返します。

さらに、 Spring Data Redis を使用して、JavaアプリケーションでRedisの地理空間サポートを有効にすることができます。

5.8. 建築

Redisは単一のコアを使用し、コアの観点から測定した場合、小さなデータセットの保存においてMemcachedよりも優れたパフォーマンスを示します。

Memcachedは、複数のコアを利用してマルチスレッドアーキテクチャを実装します。 したがって、より大きなデータセットを保存する場合、MemcachedはRedisよりもパフォーマンスが向上します。

Memcachedのマルチスレッドアーキテクチャのもう1つの利点は、複数の計算リソースを利用することで実現される高いスケーラビリティです。

Redisは、セットアップと操作が比較的複雑なクラスタリングを介して水平方向にスケーリングできます。 また、JedisまたはLettuceを使用して、Javaアプリケーションを使用してRedisクラスターを有効にすることができます。

5.9. LUAスクリプティング

Memcachedとは対照的に、Redisに対してLUAスクリプトを実行できます。 LUAスクリプトの実行に役立つEVALSCRIPTLOAD、などのコマンドを提供します。

たとえば、 EVAL コマンドを実行して、スクリプトを評価できます。

$ redis-cli eval "return redis.call('set',KEYS[1],'baeldung')" 1 website
OK

ここでは、スクリプトを評価することにより、キーwebsiteを値baeldungに設定しました。

5.10. メモリ使用量

文字列データ構造を比較すると、Memcachedのメモリ使用率はRedisよりも高くなります。

それにもかかわらず、Redisがハッシュ構造を使用する場合、Memcachedよりも高いメモリ使用率を提供します。

6. 結論

この記事では、MemcachedとRedisについて説明しました。 まず、両方のインメモリデータベースの類似点を確認しました。 次に、両方のキャッシングソリューションによって提供される機能の違いを確認しました。

利用可能な多くのメモリ内キャッシュソリューションがあります。 したがって、キャッシングエンジンの機能を検討し、それらをユースケースと照合する必要があります。

Memcachedは、単純なキャッシュの問題を解決するための確かな選択肢であると確かに結論付けることができます。 ただし、一般的に言えば、 Redisは、複雑なユースケースに有望な豊富な機能とさまざまな機能を提供することで、Memcachedよりも優れています。