2026年9月5日

2026年9月5日

WordPressのオブジェクトキャッシュをRedisで高速化する方法

はじめに

「WordPressのページ生成に毎回100件以上のDBクエリが走っている」「トランジェントをDBに保存しているのでwp_optionsが肥大化している」「同じクエリが1リクエスト内で何度も実行されている」——RedisオブジェクトキャッシュでWordPressのDBアクセスを劇的に削減できます。

症状・原因

WordPressは標準でページリクエストごとにオブジェクトキャッシュを構築しますが、リクエストをまたいで保持されません。Redisをバックエンドに使うことでDBクエリの結果をメモリ上に永続化し、複数リクエスト間で共有できます。

解決手順

ステップ1:Redisをサーバーにインストールする

# Ubuntu/Debian
sudo apt update
sudo apt install redis-server
sudo systemctl enable redis-server
sudo systemctl start redis-server

# CentOS/RHEL
sudo yum install epel-release
sudo yum install redis
sudo systemctl enable redis
sudo systemctl start redis

# 動作確認
redis-cli ping
# PONG が返れば成功

# PHP Redis拡張のインストール
sudo apt install php-redis
# または
sudo pecl install redis

# redis.conf のバインド確認(WordPress と同一サーバーなら127.0.0.1のみ)
grep "^bind" /etc/redis/redis.conf
# bind 127.0.0.1 -::1

ステップ2:Redis Object CacheプラグインをWordPressに設定する

# WP-CLIでインストール
wp plugin install redis-cache --activate

# オブジェクトキャッシュを有効化
wp redis enable

# ステータス確認
wp redis status
// wp-config.php に追加(wp-settings.php の require より前に記述)
define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );
define( 'WP_REDIS_DATABASE', 0 );   // 0〜15 のDB番号
define( 'WP_REDIS_TIMEOUT', 1 );    // 接続タイムアウト(秒)
define( 'WP_REDIS_READ_TIMEOUT', 1 );
define( 'WP_REDIS_PREFIX', 'wp_' ); // 複数サイトが同じRedisを使う場合に区別

// パスワード認証が必要な場合
// define( 'WP_REDIS_PASSWORD', 'your-redis-password' );

// Redis が使えない場合のフォールバック(true推奨)
define( 'WP_REDIS_GRACEFUL_FALLBACK', true );

ステップ3:wp_cache APIを使って手動でキャッシュする

// wp_cache_set / wp_cache_get でオブジェクトキャッシュに直接アクセス
// トランジェントと異なりDBへの書き込みが発生しない

function get_site_menu( string $location ): array {
    $cache_key   = 'menu_' . sanitize_key( $location );
    $cache_group = 'site_menus';
    $found       = false;

    $menu = wp_cache_get( $cache_key, $cache_group, false, $found );

    if ( $found ) {
        return $menu;
    }

    $locations = get_nav_menu_locations();
    $menu_obj  = isset( $locations[ $location ] )
        ? wp_get_nav_menu_items( $locations[ $location ] )
        : [];

    $menu = array_map( function( $item ): array {
        return [
            'id'     => $item->ID,
            'title'  => $item->title,
            'url'    => $item->url,
            'parent' => $item->menu_item_parent,
        ];
    }, $menu_obj ?: [] );

    // グループ付きキャッシュ(Redis有効時はメモリ上、無効時はリクエスト内のみ)
    wp_cache_set( $cache_key, $menu, $cache_group, HOUR_IN_SECONDS );

    return $menu;
}

// キャッシュグループをまとめて削除
function flush_menu_cache(): void {
    wp_cache_flush_group( 'site_menus' );
}

add_action( 'wp_update_nav_menu', 'flush_menu_cache' );

ステップ4:特定のキャッシュグループをRedisから除外する

// wp-config.php: センシティブなデータや頻繁に変わるデータを除外
define( 'WP_REDIS_IGNORED_GROUPS', [
    'counts',        // 投稿数カウント(頻繁に更新)
    'plugins',       // プラグイン関連(サイズ大)
    'wc_session_id', // WooCommerceセッション(ユーザー固有)
    'bp_',           // BuddyPress(ユーザー固有)
] );

// 特定のキーをキャッシュしない
define( 'WP_REDIS_IGNORED_KEYS', [
    'alloptions', // wp_options全件取得はキャッシュしない
] );

// キャッシュの最大サイズ設定(redis.conf)
// maxmemory 256mb
// maxmemory-policy allkeys-lru

ステップ5:Redisキャッシュのパフォーマンスを監視する

# Redis の統計情報を確認
redis-cli info stats | grep -E "keyspace_hits|keyspace_misses|used_memory_human"

# ヒット率の計算
# hit_rate = hits / (hits + misses) × 100
# 90%以上が理想

# リアルタイムモニタリング
redis-cli monitor

# WordPress で使われているキーを確認
redis-cli keys "wp_*" | head -20

# キャッシュを手動でフラッシュ(全削除)
wp redis flush
# または
redis-cli flushdb

# WP-CLIでキャッシュ統計を確認
wp redis status
wp cache flush
// 管理画面にRedisステータスを表示(デバッグ用)
add_action( 'admin_notices', function(): void {
    if ( ! current_user_can( 'manage_options' ) ) return;
    if ( ! wp_using_ext_object_cache() ) {
        echo '<div class="notice notice-warning"><p>外部オブジェクトキャッシュが無効です。</p></div>';
        return;
    }
    global $wp_object_cache;
    if ( method_exists( $wp_object_cache, 'info' ) ) {
        $info = $wp_object_cache->info();
        printf(
            '<div class="notice notice-success"><p>Redis: ヒット率 %.1f%% / メモリ使用 %s</p></div>',
            $info->ratio ?? 0,
            $info->size  ?? 'N/A'
        );
    }
} );

注意事項

  • Redisはメモリ上にデータを保存するため、サーバーのRAM容量に注意してください。maxmemorymaxmemory-policy allkeys-lruを設定して上限を設けることを推奨します。
  • WooCommerceのセッションデータなどユーザー固有のデータはWP_REDIS_IGNORED_GROUPSで除外してください。全ユーザーが同じキャッシュを共有する問題が発生します。
  • Redis接続が失敗してもWordPressが動作し続けるようWP_REDIS_GRACEFUL_FALLBACK=trueを必ず設定してください。

まとめ

RedisオブジェクトキャッシュはRedisインストール→PHPRedis拡張→Redis Object Cacheプラグイン有効化→wp redis enableでdrop-in配置→wp-config.phpでホスト/ポート/プレフィックス設定→wp_cache_set/getでグループ付きキャッシュ→WP_REDIS_IGNORED_GROUPSでセッション等を除外→redis-cli infoでヒット率監視」の流れで整備します。関連記事:WordPressのトランジェントAPIでキャッシュを実装する方法WordPressのクエリを最適化する方法

お気軽にご相談ください

お見積りへ お問い合わせへ