WordPressはウェブの大部分を稼働しているコンテンツ管理システム(CMS)ですが、その人気の高さゆえ、パフォーマンスを維持するのが難しいという課題があります。そこで活用したいのが、Redisのオブジェクトキャッシュです。インメモリ型のデータベースであるRedisは、WordPressのパフォーマンスを改善する強力なソリューションとなり、サイトのプライマリデータベースに送信されるクエリの数を減らすことができます。

今回は、WordPressサイトにRedisをインストールして使用する方法をご紹介します。Kinstaをご利用の場合、このプロセスはかなり簡単です。

オブジェクトキャッシュとは

WordPressサイトのページを読み込むと、通常サーバーはコンテンツ、設定、およびページを表示するために必要なデータを取得するために複数のデータベースクエリを実行します。それぞれのクエリには時間を要します。サイトが大きくなるにつれて、小さな遅延が積み重なり、顕著な速度低下を引き起こす可能性があります。

オブジェクトキャッシュは、これらのデータベースクエリの結果をメモリに保存し、必要になるまで待機してくれます。

オブジェクトキャッシュは、単純な速度改善だけでなく、WordPressサイトがデータを取得・処理する方法に柔軟性を与えます。マーケティングキャンペーンの成功時やSNSでのバイラルコンテンツ投稿後など、サイトのトラフィックが突然急増した場合、Redisは訪問者とデータベースの間のバッファとして機能します。

各訪問者のリクエストに対してデータベースクエリを実行するのではなく、Redisがメモリからキャッシュされたデータを提供することで、パフォーマンスを損なうことなく、サイト全体で圧倒的に多くの同時接続を処理できるようになります。

例えば、年始の初売りセールを開催するECサイトでは、Redisによって商品情報がキャッシュされることでデータベースの負荷が軽減し、サーバーリソースを追加することなく、より多くのトラフィックを処理できます。この効率化は、既存のインフラでより多くの訪問者に対応できるため、サーバー費用の削減に直結します。

WordPressとデータベースのやり取り

WordPressがデータベースとどのようにやり取りするかを理解することで、サイトの成長にキャッシュが重要である理由がよりわかりやすくなります。例えば、誰かがサイトのトップページにアクセスするとします。ページキャッシュで応答しない限り、WordPressは動的なページを構築するために複雑なデータベースクエリを実行します。

Kinstaウェブサイトのトップページ
Kinstaウェブサイトのトップページ

まず、WordPressはwp_optionsテーブルに問い合わせ、サイトの設定、テーマの構成、使用中のプラグインを取得します。

SequelAceアプリ内のwp_optionsテーブル
SequelAceアプリ内のwp_optionsテーブル

サイドバーに追加のウィジェットやブロック、要素がある場合は、また別のクエリがトリガーされます。例えば、最近の投稿セクションには投稿データが必要になり、カテゴリーの表示には投稿数のカウントが必要になり、検索機能にはインデックスを構築しなければなりません。

WordPressサイトエディターでサイドバーを編集
WordPressサイトエディターでサイドバーを編集

ページビルダープラグイン複雑なテーマを使ったサイト、動的なコンテンツを扱うサイトでは、クエリはさらに大幅に増加します。一般的なブログの場合、記事には投稿者の情報、カテゴリー、タグ、関連記事が表示されます。

WordPressサイトエディター内のブログ記事レイアウト例
WordPressサイトエディター内のブログ記事レイアウト例

トップページの各投稿プレビューでは、複数のテーブルにまたがるデータを結合する必要があります。wp_postsからコアコンテンツを取得し、wp_usersから投稿者情報を取得し、wp_postmetaからメタデータを収集します。たった10件の投稿プレビューを表示する場合であっても、何十もの個別のデータベースクエリを実行する可能性があります。

WordPressデータベース内のボトルネック

このデータベースのアーキテクチャにより、パフォーマンスに影響を与える一般的なボトルネックも明らかにします。カスタム投稿タイプは、コンテンツを整理するのに有用ですが、追加のフィールドを保存するためにwp_postmetaに依存します。

オンラインストアや不動産検索サイトでは、各商品や物件を表示するためだけに、ページ読み込みごとに何百ものクエリを実行する場合があります。それぞれ、広さ、数量、価格、部屋数、バリエーションなど、個別の情報を個別のメタデータ項目として表示しなければなりません。

wp_optionsテーブルもまた、プラグインが提供する設定を保存することから、ボトルネックになり得ます。

同時接続を考慮するとその影響はより顕著で、各訪問者はそれぞれ独自のクエリセットを起動し、WordPressはそれぞれのクエリに対して独立した処理を実行します。トラフィックが急増すると、この処理がボトルネックとなり、サイト全体が遅くなる場合があります。

このようなデータベースのやり取りは、キャッシュを非常に価値のあるものにします。Redisのオブジェクトキャッシュを適切に実装すれば、繰り返されるクエリをインターセプトし、結果をメモリに保存することができます。訪問者ごとに複数の結合やメタデータクエリを実行するのではなく、Redisから事前に処理済みのデータを直接取得できます。その結果、何十回ものデータベースクエリを1回のキャッシュ検索に削減することができます。

WordPressの主要なオブジェクトキャッシュ

WordPressのオブジェクトキャッシュソリューションに関しては、いくつか選択肢があります。すべてのサーバーがすべてをサポートしているわけではないため、利用しているサーバーで使用できるかどうかをまずは確認しましょう。

Memcachedは最も古く、最も広く使われているものの1つで、シンプルで効果的な分散メモリキャッシュシステムです。その長い歴史から多くのサポートがあり、リソースの使用に関しては一般に軽量です。優れたサポートとドキュメントにより、あらゆるレベルのオブジェクトキャッシュに人気のソリューションです。

Memcachedのウェブサイト
Memcachedのウェブサイト

使いやすさに重点が置かれているため、複雑なシナリオには不向きかもしれません。また、Memcachedは永続ストレージを提供していないため、次のページが読み込まれるまでにクリアされてしまいます。

Couchbaseは、ドキュメントデータベース機能、標準的なキーバリューストア、および内蔵のクラスタリングを組み合わせた、より高度なソリューションです。内蔵のクラスタリングは、より良いパフォーマンスのためにデータを自動的にグループ化するもので、WindowsのデフラグがOSのディスクパフォーマンスを向上させるのに似た仕組みになっています。

Couchbaseのウェブサイト
Couchbaseのウェブサイト

しかしながら、Couchbaseのキーバリューストアは、ドキュメント指向のアーキテクチャに比べて副次的なものです。クエリの制限が少なく、データ検証や整合性においてより高い正確性が必要になる場合は、欠点になり得ます。

RedisはWordPressと相性が良い

WordPressでRedisを使用することは、他のソリューションと比較していくつかの利点があります。例えば、RedisはMemcachedとは異なり、Redisはリスト、セット、ソートされたセットなどの複雑なデータ構造をサポートしています。これはWordPressのデータ編成の要件と合致しており、より大規模で複雑なセットアップに向けての拡張をサポートしてくれます。

これらの異なる構造を使用する場合は、Redisの「アトミック操作」が重要になります。これは簡単に言えば、トランザクションの概念を利用し、様々なコマンドをグループ化して一度に実行する操作です。実際の機能はもっと複雑ですが、アトミック操作により一般的にデータの一貫性を保証することができます。

また、以下のような利点もあります。

  • 永続性:Redisはデータをディスクに永続化できるため、インメモリソリューションと比較して、より高いデータ耐久性が実現される。
  • より優れたメモリ管理Redisのメモリ管理機能は他のキャッシュツールよりも洗練されており、オブジェクトキャッシュの動作をより適切に制御できる。

Redisにはオブジェクトキャッシュ以外の用途もありますが、WordPressの場合は、Redisのキーバリューストアと特に相性が良いと言えます。

WordPressとRedisの関係性

WordPressは、WP_Object_Cache関数を通じて独自のオブジェクトキャッシュ機能を提供しています。キャッシュされたデータを管理するために標準化された関数を用いて、サイトのコードとデータベースの間の仲介層として機能します。

プラグインやテーマがデータを要求すると、WordPressはまずこれらの組み込み関数を使ってオブジェクトキャッシュにデータが存在するかどうかを確認します。例えば、ユーザーのコメント数を取得するコードは以下のようになります。

function get_user_comment_count($user_id) {
    // 一意のキャッシュキーを生成
    $cache_key = 'user_comment_count_' . $user_id;
    
    // まずキャッシュから値を取得
    $comment_count = wp_cache_get($cache_key, 'user-stats');
    
    // キャッシュにない場合は、データベースに問い合わせる
    if (false === $comment_count) {
        global $wpdb;
        $comment_count = $wpdb->get_var(
            $wpdb->prepare(
                "SELECT COUNT(*) FROM $wpdb->comments WHERE user_id = %d",
                $user_id
            )
        );
        
        // 結果をキャッシュに保存し、将来のリクエストに備える
        wp_cache_set($cache_key, $comment_count, 'user-stats', 3600); // Cache for 1 hour
    }
    
    return $comment_count;
}

Redisを設定している場合、この関数はデータベースリクエストをインターセプトし、WordPressがデータベースクエリを行う前に、必要なデータがRedisキャッシュに存在するかどうかを確認します。

Redisが複雑なデータ構造を扱う能力は、WordPressの階層的なコンテンツ組織に似ています。例えば、WordPressが親ページのすべての子ページと関連するメタデータのような複雑なクエリ結果を取得する必要がある場合、Redisはこのデータ構造全体を単一のキャッシュエントリとして保存します。

この統合により、パフォーマンスが大幅に向上する可能性があります。Redisはすべてのデータをメモリ上に保存するため、アクセス時間はデータベースクエリに通常必要なミリ秒ではなく、マイクロ秒単位になります。一見大した違いではありませんが、データベースの使用量が多いサイトでは、このわずかな差によってページの表示速度が2倍から3倍速くなります。

WordPressのオブジェクトキャッシュは追加設定を行うことで、高度なRedis機能もサポートします。たとえば、キャッシュタグを実装して、よりきめ細かなキャッシュ管理を行うことができます。

function get_category_posts($category_id) {
    $cache_key = 'category_posts_' . $category_id;
    
    $posts = wp_cache_get($cache_key, 'category-posts');
    
    if (false === $posts) {
        $posts = get_posts(array(
            'category' => $category_id,
            'posts_per_page' => 10
        ));
        
        wp_cache_set(
            $cache_key,
            $posts,
            'category-posts',
            3600,
            array(
                'tags' => array(
                    'category_' . $category_id,
                    'front_page_content'
                )
            )
        );
    }
    
    return $posts;
}

// 後でこのカテゴリーの投稿が更新された際
wp_cache_delete_by_tag('category_' . $category_id);

WordPressとRedisのこの関係性は、データの一貫性を維持しながらデータの永続性をスマートに管理する強力なキャッシュシステムを構築します。WP_Object_Cache機能により、直接実装することなく、すべてのプラグインとテーマがRedisキャッシュの恩恵を受けられるようになります。また、Redisの高度な機能により、複雑なWordPressに必要な柔軟性を提供することができます。

Kinstaでは5分以内にRedisのインストールが可能

例えば、アクセスの増加により、WooCommerceサイトの速度が低下するとします。多くのウェブサーバーでは、Redisを実装するには、サーバーへのアクセス、手動インストール、セキュリティ設定、および慎重なテストが必要になります。このような技術的な作業は1日がかりになり、エラーが発生すればさらに時間がかかります。対照的に、KinstaでのRedis実装方法は非常にシンプルです。

専用コントロールパネルのMyKinstaから数回のクリック(「WordPressサイト」>(サイト名)>「キャッシュ」>「Redis」)で、Redisオブジェクトキャッシュを有効化することができます。月額100ドルで利用可能です。

MyKinstaでRedisキャッシュを有効化
MyKinstaでRedisキャッシュを有効化

KinstaとRedisの統合には、以下のような特徴があります。

  • WordPressサイトに最適な設定を適用─特にECサイトのカゴ落ち問題に対応するためのキャッシュの有効期限の調整も含まれます。が含まれるため、カゴ落ちが題になる可能性がある場合です。有効期限の最適化は、不適切に構成されたRedisのインストールにおいてよく見られる問題です。
  • Redisはバックグラウンドで実行─オブジェクトキャッシュが提供するパフォーマンスの恩恵を受けながらサイト管理を通常通り継続できます。
  • オブジェクトキャッシュの監視に関して柔軟性があり、Kinstaの機能やアーキテクチャと深く統合されています。

Redisが全体的なキャッシュ戦略の一部になるため、MyKinstaの他のツールとの統合も大きな利点です。また、パフォーマンスの影響を監視することも、考慮すべき重要な点になります。

KinstaサイトにRedisを導入する方法

KinstaでホスティングするWordPressサイトにRedisのオブジェクトキャッシュを導入する方法は非常に簡単です。アドオンを有効にすると、Redis Object Cacheプラグインが自動的にインストール・設定されるため、作業は不要です。このプラグインを無効にするには、WordPress管理画面にログインして、「プラグイン」ページにある「無効化」をクリックする必要があります。

WordPress管理画面のプラグインページからRedis Object Cacheプラグインを無効化
WordPress管理画面のプラグインページからRedis Object Cacheプラグインを無効化

Redis管理の多くは、プラグインの設定を通じてWordPressサイト上で行われます。これはキャッシュのクリアも同様で、Kinsta MUプラグインにより、上部のツールバーにオブジェクトキャッシュをクリアするメニューが出現します。

WordPress管理画面ツールバーのオブジェクトキャッシュメニュー
WordPress管理画面ツールバーのオブジェクトキャッシュメニュー

Redisキャッシュのクリアは、MyKinstaでも実行可能です。「WordPressサイト」>(サイト名)>「キャッシュ」>「サーバーキャッシュ」に移動し、「キャッシュをクリア」をクリックします。

MyKinstaのサーバーキャッシュタブ
MyKinstaのサーバーキャッシュタブ

これにより、Secure Shell(SSH)WP-CLIを使用する別のアプローチと同様、サイトが使用するすべてのキャッシュがクリアされます。

Kinsta以外のWordPressサーバーにRedisを導入する方法

Redisはオブジェクトキャッシュを設定する一般的な方法になりますが、すべてのサーバーでアクセスや統合を提供しているわけではありません。使用しているサーバーによっては、サーバー上のコードを編集する必要があります。

この手順はサーバーによって異なりますが、場合によっては必要になるroot権限も付与されていないかもしれません。基本的な手順にはサーバーの準備、Redisのインストール、そして使用するためのWordPress設定が含まれます。

サーバーの準備とインストール

Redisをインストールするには、適切に設定されたサーバー環境が必要です。使用しているサーバーによっては、適切なプランやサーバーへの移行が必要になるかもしれません。一般的な共用サーバーや一部マネージドサーバーでは、これを実行することができません。Redisの導入には仮想専用サーバー(VPS)、できれば専用クラウドサーバーが理想的です。

いずれにしても、PHPのインストールには拡張モジュールのphpredisが必要になります。特定のコンパイルフラグや設定オプションを使用しますが、これらは多数存在します。

Ubuntuシステムでは、以下の方法で必要なコンポーネントをインストールします。

sudo apt-get update
sudo apt install redis server

インストールが完了したら、sudo service redis statusを実行して、Redisが正常に動作しているかを確認します。redis-cli --version を実行することでも確認可能です。

Redisがサーバー上で動作するようになったら、phpredisをインストールします。

sudo apt-get install php-redis
sudo phpenmod redis

以上でRedisのインストールが完了です。続いては、サーバーと使用可能なリソースに合わせて設定を行います。

Redisの設定

Redisサーバーの設定ファイルは、サイトで動作させる前に注意が必要です。まずはじめに、WordPressとRedisが同じサーバーで動作するかどうかを確認します。通常は動作するため、ローカルホストのアドレス(127.0.0.1)を関連付けます。

Redisの設定ファイルは、どのエディターでも開くことがきますが、nanoであればほぼすべてのサーバーインスタンスで利用できます。

sudo nano /etc/redis/redis.conf

ほとんどの場合は、正しい行を見つけて変更を保存する前にコメントを解除できます。

bind 127.0.0.1 ::1 # ループバックのIPv4とIPv6をリッスンする

設定ファイルにさらに変更を加えたい場合、以下がWordPressに適した設定です。

maxmemory 256mb
maxmemory-policy allkeys-lru
appendonly yes
appendfsync everysec
save 900 1
save 300 10
save 60 10000

各設定はそれぞれ以下の目的に役立ちます。

  • maxmemory:ほとんどのWordPressサイトでは、256MBが適切です。Redisが過剰なシステムメモリを消費するのを防ぐと同時に、パフォーマンスを大幅に改善するのに十分なキャッシュ領域を維持できます。
  • allkeys-lru maxmemory-policy:最も頻繁にアクセスされるコンテンツがキャッシュに残るようにします。サイトによっては、特にセッションデータを通常のコンテンツと一緒にキャッシュする場合、volatile-lruを使用すると便利です。
  • appendonlyappendfsync:Redisの永続化動作を管理します。Redisは主にキャッシュとして機能しますが、永続性を維持することで、サーバーの再起動時にキャッシュが完全に失われるのを防ぎます。everysecの設定は、パフォーマンスとデータの安全性のバランスを取ります。

saveディレクティブは、Redisがデータセットのポイントインタイムスナップショットを作成するタイミングを制御します。上記の例では、以下に指定しています。

  • 1回の変更後に15分ごと
  • 10回の変更後に5分ごと
  • 10,000回の変更後に1分ごと

これらの永続化設定は、データの損失を防ぎながらキャッシュの効率を維持するのに便利です。

Redisのセキュリティ設定と変更のテスト

このステップでは、セキュリティについても調べる必要があります。例えば、requirepassコマンドを使ってパスワード認証を設定したり、扱い要注意のコマンドの名前を変更したりすることもできます。またRedisのアクセス制御リスト(ACL)は、特定の間違えると危険なコマンドに制限をかけるものです。リスト全体に目を通して影響するものがないか確認してください。

以上の作業を行ったら、Redisサーバーのパフォーマンスをテストすることをおすすめします。Redis CLIにこれに役立つベンチマークコマンドがいくつか用意されています。:

redis-cli --latency
redis-cli info | grep used_memory_human
redis-cli info | grep connected_clients

これらは継続的な監視のためにベースラインのパフォーマンス指標を確立するもので、定期的なメンテナンスのワークフローの一部になります。

WordPressの設定

Redisをサーバー上で実行したら、WordPressでオブジェクトキャッシュが使用できるように設定します。これには通常、ホスト、ポート、認証情報などのRedis接続の情報を指定します。

適切なオブジェクトキャッシュのドロップインファイルを手動でwp-content ディレクトリに追加することもできますが、専用のRedis Object Cacheプラグインをインストールするのが最善です。Kinstaでは、独自のキャッシュ機能を実装しているため、Redis Object Cacheを除く多くのキャッシュプラグインをサポートしていません。Redis Object Cacheプラグインは、WordPressをキーバリューストアに接続するための仲介役として機能します。

その他のRedis管理

一般的なRedisオブジェクトキャッシュは、Redis CLIへのアクセスを提供します。Kinstaでは開発ワークフロー全体にわたって拡張され、ステージング環境やDevKinstaなどでも利用可能です。

基本的な監視

このコマンドラインインターフェースは、Redisインスタンスに接続し、キャッシュがどのように動作しているかを即座に把握するための強力な機能を提供します。例えば、キャッシュされたデータのパターンを明らかにしたり、メモリ使用量を分析したり、メンテナンスタスクをリアルタイムで実行したりすることができます。

重要なコマンドは以下のとおりです。

redis-cli INFO stats           # キャッシュのヒットとミスを表示する
redis-cli INFO memory         # メモリ使用率のチェックする
redis-cli MONITOR            # キャッシュ操作をリアルタイムで見る

MONITORコマンドはキャッシュ操作をリアルタイムで表示し、WordPressがRedisとどのようにやり取りしているかを正確に見ることができます。この可視性は、キャッシュパターンと最適化の機会を特定するのに便利です。SLOWLOGコマンドは問題のあるクエリを特定します。

redis-cli SLOWLOG GET 10     # 最近の最も遅いオペレーション10件を見る
redis-cli SLOWLOG RESET      # 新しい監視のためにスローログをクリアする

Redisが提供できる機能をさらに拡張するオプションもあります。

より深いRedis監視コマンド

リソースを抑制する簡単な方法は、Redisの接続制限を監視することです。リソースの枯渇を防ぐ優れた方法になります。

redis-cli CLIENT LIST | wc -l    # アクティブな接続を数える
redis-cli CONFIG GET maxclients  # 最大接続数の確認する

WordPressは、データベースの読み取りアクセスを高速化するためにRedisを使用します。キャッシュされたデータは永続的で、将来再度使うことができます。これをサポートするため、Redisは保存するキーに対して「追い出しポリシー」をサポートしています。

ただし、これはメモリを圧迫する可能性もあり、低い「ヒット率」(既存のキーに対する操作の総数を比較)はその証拠となるため、以下の指標を追跡することが重要になる場合があります。

redis-cli INFO stats | grep evicted_keys
redis-cli INFO stats | grep hit_rate

データベースがメモリ不足になっていることが判明したら、利用可能なメモリを増やし、キーの期限切れポリシーを最適化して、臨機応変なキャッシュ戦略を導入しましょう。具体的な対策は、サイトやメモリの負荷によって異なります。

RedisでGUIを使用する

RedisのコマンドやCLIを使用することで、さらに可能性が広がります。これにはRedis Insightアプリが便利です。

Redis Insight GUIアプリ
Redis Insight GUIアプリ

ターミナルやサーバーへのアクセス、コマンドラインでの作業を必要とせずに、Redisオブジェクトキャッシュを表示するGUIを提供します。TablePlusSequelAceのようなツールを使ってWordPressのデータベースを見るように、Redis Insightのようなアプリは素早くセットアップでき、ワークフローを効率化してくれます。

一般的なRedisの課題と解決策

一般に、Redisはメンテナンスを行わなくても動作しますが、実装方法によっては、注意が必要な問題が発生することがあります。例えば、MyKinstaでは「WordPressが適切な接続プラグインを検出できない」という旨の警告が表示されることがあります。

これはRedis Object Cache以外のプラグインを使用する場合に表示されるもので、ほとんどの状況では無視してもOKですが、Redisを適切に実行するには、適切な接続プラグインが必要です。

例えば、KinstaのAPMツール(またはMyKinstaの分析画面)で分析を行うと、正しい指標が表示されないことがあります。この場合は、カスタムRedisインスタンスを設定することで問題を解決できます。

KinstaでRedisを導入する際の注意点として、たとえば通常とは異なる方法でWordPressをインストールしている場合、さまざまなエラーが表示される可能性があります。Bedrockの使用が一般的な要因になります。その際は、カスタマーサポートまでお問い合わせください。

まとめ

Redisオブジェクトキャッシュは、効率的なデータの保存と取得により、WordPressサイトの大幅なパフォーマンス改善を実現します。成功のカギは、適切な実装、定期的な監視、およびメンテナンスにあります。Kinstaのマネージドサーバーを利用することで、これらの原則の範囲内で作業し、サイトパフォーマンスの最適化を維持することができます。

Redisを導入するには、まず適切なサーバー設定から。その後WordPressと統合し、定期的な監視と最適化によってパフォーマンスの向上を維持します。このアプローチは、Kinstaを土台に、サイトと共に成長する堅牢なキャッシュインフラを構築するのに役立ちます。

Steve Bonisteel Kinsta

Kinstaのテクニカルエディター。救急車や消防車を追いかける記者としてキャリアをスタート。1990年代後半からインターネット関連の技術情報を担当している。