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容量に注意してください。
maxmemoryとmaxmemory-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のクエリを最適化する方法。