MemcachedとRedisのどちらを使えばよいのでしょうか。

ElastiCacheやWebフレームワークのキャッシュ管理をしようとすると、確実に決めなければならない問題です。

本記事では主にMemcachedの使い方やインストール方法について解説します。

またMemcachedとRedisの利用シーンを比較し、どのような違いがありどちらを選ぶべきかを考えましょう。

Memcachedとは

Memcachedはキャッシュサーバーの1種です。分散型のメモリキャッシュシステムを構築することができます。

2003年にDanga Interactiveで開発されました。

内部的にはKey-Value型ストアで、データを複数のサーバーに分散させて格納します。

AWSにはMemcached用のAmazon ElastiCacheの用意があるほか、有名サービスではYouTubeやWikipediaが採用しているシステムです。


Memcachedの利用シーン

Memcachedの利用シーンについて見ていきましょう。


RDBMSの高速化・負荷軽減

データベースへの問い合わせ結果を一時的に格納することで、ユーザーへのレスポンスが高速になるなどパフォーマンスが向上します。

またデータベースへの問い合わせ回数が減るため、データベースにかかる負荷も減るでしょう。


静的コンテンツ

トラフィックの多いWebアプリケーションにおいて、変化のあまりないコンテンツを格納し高速化を図ります。

HTMLコード片などの比較的小さな静的データを、参照頻度の高いものから優先的に保存・更新するキャッシュです。


Memcachedのインストール

Memcachedのインストールを行いましょう。

memcached

memcached/memcached

以後、説明はUbuntu 18.04.4 LTSの環境で行います。


Memcachedのインストール

DebianやUbuntuなどのAPTを採用しているLinuxディストリビューションでは以下のコマンドでインストールをして下さい。

memcached –version」でインストールされているか確認しましょう。

  1. $ apt update
  2. $ apt install memcached
  3. $ memcached –version
  4. memcached 1.5.6


クライアントのインストール

Memcachedはただのインメモリデータストアなので、キャッシュするデータを用意して連携させないといけません。

例えばWebアプリケーションフレームワークRuby on Railsに導入するとしたら、以下のような初期設定を行います。

  • DalliというRuby用のMemcachedクライアントをインストール
  • Rails側でキャッシュとセッションの設定

インストールするクライアントは言語ごとに異なるので、「言語名 memcached client」で検索して探して下さい。

Pythonであれば「pymemcache」「python-memcached」など、いくつか候補が出てきます。

アプリケーション側の設定は本記事では触れません。詳細はライブラリやフレームワークの公式ドキュメントを参照下さい。


Memcachedの設定方法

Memcachedの設定ファイルは「/etc/memcached.conf」です。このファイルの中身を修正して設定を変更します。

もっとも各設定の説明がコメントで記載されている上、設定テキストもコメントアウトされている親切な設定ファイルです。

それぞれ丁寧に確認していけば大丈夫なので安心して下さい。

念の為、設定ファイルのコピーを取っておくことをおすすめします。


ログ出力

ログファイルの出力先変更です。

  1. # Log memcached’s output to /var/log/memcached
  2. logfile /var/log/memcached.log

出力先のパーミッションに注意して下さい。

次はログの出力レベルをVerboseに変更するコマンドです。

  1. # Be verbose
  2. -v
  3. # Be even more verbose (print client commands as well)
  4. -vv

Verboseログは通常よりも詳細なログを出力します。一般的にはDebugログと同等かそれ以上の情報を出力するログです。


メモリ設定

デーモンのメモリの上限を設定します。デフォルト値は64MBです。

  1. # memory
  2. -m 64

また全ページメモリのロックダウンができます。この設定には多くの注意点がありますので、公式ドキュメントを参照して下さい。

  1. # Lock down all paged memory. Consult with the README and homepage before you do this
  2. -k

メモリ不足に陥った際にエラーを返却する設定も可能です。

  1. # Return error when memory is exhausted (rather than removing items)
  2. -M


IPアドレス・ポート設定

Memcachedのポート番号を変更できます。

  1. # Default connection port is 11211
  2. -p 11211

このポートが外部に開放されていると、情報漏えいや踏み台攻撃などのセキュリティ上の問題が発生するため注意が必要です。

またIPアドレスは次のように設定します。

  1. # it’s listening on a firewalled interface.
  2. -l 127.0.0.1

ポートと同様、セキュリティの確認が必要でしょう。


実行ユーザー設定

Memcachedは通常rootユーザーとしてデーモンを実行します。しかし以下の設定によりデフォルトではmemcacheユーザーでの実行です。

  1. # -u command is present in this config file
  2. -u memcache


同時アクセス数設定

同時アクセス数の制限設定ができます。

  1. # Limit the number of simultaneous incoming connections. The daemon default is 1024
  2. -c 1024


その他

Memcachedコアファイルの上限サイズを最大にするコマンドです。

  1. # Maximize core file limit
  2. -r

制御プロセスIDファイルを指定します。

  1. # Use a pidfile
  2. -P /var/run/memcached/memcached.pid


Memcachedの使い方

Memcachedの使い方を見ていきましょう。


サービスの起動・停止

サービスの起動は以下のコマンドで実行します。

  1. $ service memcached start
  2. Starting memcached: memcached.

サービスの停止は次のようなコマンドです。

  1. $ service memcached stop
  2. Stopping memcached: memcached.

上記以外のコマンドは「service memcached」で確認できます。

  1. $ service memcached
  2. Usage: /etc/init.d/memcached {start|stop|status|restart|force-reload}

コマンドはOSごとに異なりますが、再起動後の自動起動設定をしておくのが良いでしょう。


手動で実行する

Memcachedの設定ファイルは少々変わっていました。まるでコマンドのオプションをそのまま設定ファイルに書いたようです。

実はコマンドラインから直接オプションを渡して実行することもできます。

  1. $ memcached -u memcache


Memcachedの使えるコマンド

以降はtelnetでMemcachedに接続してから使用できるコマンドです。

  1. $ telnet localhost 11211

Telnetクライアントは遠隔操作するためのプロトコルの1つで、Ubuntuであれば以下のコマンドでインストールできます。

  1. $ apt install -y telnet

全てを網羅することはできませんので、ここでは一部のよく使うコマンドのみを紹介しましょう。

便宜上、実際に打ち込むコマンドの前に「> 」を付けて記載しますが、実際のコンソールでは何も表示されません。

真っ黒な画面に直接コマンドを打ち込んで下さい。


検索コマンド

キー(key)からデータを検索し見つかったもの全てを返却します。

  1. > get <key>

具体的な使い方は以降で出てくるので、そちらを参照して下さい。


ストレージコマンド

データを保存・上書きします。

  1. > set <key> <flags> <exptime> <bytes>
  2. > value

具体的な使い方は以下です。

  1. > set hoge 0 300 10
  2. > fugafuga
  3. STORED
  4. > get hoge
  5. VALUE hoge 0 10
  6. fugafuga
  7. END

addコマンドはデータがまだ存在しない場合に、データを追加します。

  1. > add <key> <flags> <exptime> <bytes>
  2. > value

正常時の動作は同じですが、既にあるデータに対して操作を行うとNOT_STOREDと表示されるコマンドです。

  1. > add hoge 0 300 10
  2. > fugafuga
  3. NOT_STORED

既に存在するデータを置き換えるreplace、既に存在するデータの最初・最後にデータを追加するprepend・appendがあります。

いずれも使い方はaddと同じなので省略させて下さい。


ステータス・統計コマンド

基本のステータスコマンドです。PIDやバージョンなどのMemcachedサーバーの情報を一覧表示します。

  1. > stats
  2. STAT pid 423
  3. STAT uptime 26225
  4. (中略)
  5. STAT direct_reclaims 0
  6. STAT lru_bumps_dropped 0
  7. END

以下のコマンドはアイテムごと・スラブIDごとの統計情報を表示するコマンドです。

  1. > stats items
  2. > stats slabs

またstats sizesコマンドを使用すると、アイテムのサイズと数に関する情報を表示します。


Redisとは

Redisは永続化可能なインメモリデータベースです。

2009年にSalvatore Sanfilippo氏によって開発されました。

Redisインスタンス1に対して複数のデータベースを構築可能で、レプリケーション機能による可用性の向上が可能です。

AWSにはRedis用のAmazon ElastiCacheの用意もあります。また有名サービスではGitHubやTwitterが採用しているシステムです。


Redisの利用シーン

Redisの利用シーンについて見ていきましょう。


データ分析の高速化

大量の静的ファイル・データベースからデータを取得し、 Apache HadoopやApache Sparkなどを使用してデータ解析を行うとします。

このときRedisを分散型のインメモリデータストアとして利用すると、処理速度を大幅に改善することができるでしょう。


データ取得の高速化

Apache HadoopやRDBMSから大量のデータを取得するには、ある程度の時間がかかります。

Redisはインメモリデータベースであり、様々なデータ構造でデータを格納できるKey-Value型ストアです。

Redisからデータを取得するように設計すれば、これらの時間を短縮できるでしょう。


Redisとの違い

次はMemcachedとRedisの違いについてです。


キャッシュとデータベース

Memcachedの基本的な使い方はキャッシュです。ある処理とデータソースとの間に設置し、取得時間の短縮を行います。

一方Redis自体は永続化可能なデータベースです。Redis内のデータに対する操作用のコマンドが多く用意されています。

Memcachedのデータは再起動をすると消えてしまいますが、Redisはスナップショットから復元を行いある程度元の状態に戻すことが可能です。

Memcachedはレプリケーションができません。永続化についてもあまり考慮されてはいないでしょう。

これらのMemcachedにできないことがあるならRedisを採用しなければなりません。


単純さ・複雑さ

Redisは言語サポートや機能が充実している代わりに、取り扱うデータ構造も多くモデルも複雑になります。

Memcachedはキャッシュに目的を置いているため、できることがシンプルで分かりやすいメリットがあるでしょう。

またMemcachedはマルチスレッドですが、Redisはシングルスレッドです。

このためスケールアウト・イン機能を手軽に利用したい場合はMemcachedを選択する必要があります。

Memcached用のElastiCacheでは単一ノード当たりのパフォーマンスは、CPUのコア数を上げるほど向上するでしょう。


おわりに

Memcachedの目的はあくまでキャッシュであり、Redisの目的はインメモリ型のデータストアです。

実際、迷ったらRedisを選んでおくのが無難といわれています。

しかし現在でもMemcachedが選択されている理由は、Memcachedが適した利用シーンでは優れた速度改善と負荷分散を行うからです。

仕事ではMemcached単体で使うことはなく、周辺技術やフレームワークへの理解も必要になるでしょう。

まだまだ学ぶべきことは沢山ありますが、Memcachedが何かを理解していれば学習速度も定着率も向上する筈です。

この記事が少しでも役に立てば幸いに存じます。


toiroフリーランスは、SHIFTグループがプライムとして参画している独自案件をフリーランスエンジニア向けに紹介する唯一のプラットフォームサービスです。

エージェントによるサポートもありますので、ご利用を検討してみてはいかがでしょうか。