2026年9月16日
2026年9月16日
Redis Object Cacheのエラーを解決する方法
はじめに
Redis Object Cacheプラグインを有効化したがRedisサーバーへの接続が確立できずエラーが表示される・Redisキャッシュをフラッシュすると特定のデータが消えてWooCommerceのセッションが切れる・PHPのメモリ制限に達してキャッシュが書き込まれない・マルチサイト環境でサイト間のキャッシュが混在するといった問題は、Redis接続設定・キャッシュグループの分離・wp-config.phpの設定が原因です。
症状・原因
- WordPressダッシュボードに「Redisサーバーに接続できません」エラーが表示される
- Redisキャッシュを有効にするとログイン状態が保たれずセッションが頻繁に切れる
- 「wp cache flush」を実行するとサイト全体が一時的に重くなる(コールドスタート)
- マルチサイトのサブサイトで他のサイトのキャッシュデータが参照される
解決手順
ステップ1:Redis接続の状態を確認する
# Redis接続診断
wp eval "
// プラグインの状態を確認
if (defined('WP_REDIS_VERSION')) {
echo 'Redis Object Cache version: ' . WP_REDIS_VERSION . PHP_EOL;
}
// Redis接続設定を確認
\$host = defined('WP_REDIS_HOST') ? WP_REDIS_HOST : '127.0.0.1';
\$port = defined('WP_REDIS_PORT') ? WP_REDIS_PORT : 6379;
echo 'Redis host: ' . \$host . PHP_EOL;
echo 'Redis port: ' . \$port . PHP_EOL;
// 接続テスト
try {
\$redis = new Redis();
\$connected = \$redis->connect(\$host, (int)\$port, 2.5);
if (\$connected) {
echo 'Connection: OK' . PHP_EOL;
echo 'Redis version: ' . \$redis->info('server')['redis_version'] . PHP_EOL;
echo 'Used memory: ' . \$redis->info('memory')['used_memory_human'] . PHP_EOL;
echo 'Keys count: ' . \$redis->dbSize() . PHP_EOL;
}
} catch (Exception \$e) {
echo 'Connection failed: ' . \$e->getMessage() . PHP_EOL;
}
// WordPress Object Cacheの統計
global \$wp_object_cache;
if (method_exists(\$wp_object_cache, 'stats')) {
\$stats = \$wp_object_cache->stats();
echo 'Cache hits: ' . (\$stats['hits'] ?? 0) . PHP_EOL;
echo 'Cache misses: ' . (\$stats['misses'] ?? 0) . PHP_EOL;
}
"
ステップ2:wp-config.phpのRedis設定を修正する
// wp-config.php: Redis接続設定(wp-config.phpに追加)
// ① 基本接続設定
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_DATABASE', 0); // 使用するRedisデータベース番号
define('WP_REDIS_TIMEOUT', 2.5); // 接続タイムアウト(秒)
define('WP_REDIS_READ_TIMEOUT', 2.5); // 読み取りタイムアウト(秒)
// ② キャッシュキーのプレフィックス(マルチサイト対応)
define('WP_REDIS_PREFIX', 'mysite_'); // サイト固有のプレフィックス
// ③ フラッシュから保護するキャッシュグループ
define('WP_REDIS_IGNORED_GROUPS', [
'counts',
'plugins',
'themes',
]);
// ④ 選択的フラッシュのグループ設定
define('WP_REDIS_UNFLUSHABLE_GROUPS', [
'userlogins',
'user_meta',
'sessions', // セッションデータはフラッシュから保護
]);
// ⑤ 接続失敗時のフォールバック
define('WP_REDIS_GRACEFUL', true); // 接続失敗時にPHPキャッシュにフォールバック
define('WP_REDIS_MAXTTL', 86400); // TTL最大値(24時間)
ステップ3:キャッシュグループを適切に管理する
// functions.php: キャッシュグループ管理
// ① カスタムデータをRedisに保存
function get_cached_expensive_query(int $user_id): array {
$cache_key = 'user_stats_' . $user_id;
$cache_group = 'user_data';
$cached = wp_cache_get($cache_key, $cache_group);
if ($cached !== false) {
return $cached;
}
// 重いクエリを実行
global $wpdb;
$data = $wpdb->get_results(
$wpdb->prepare(
"SELECT COUNT(*) as count, post_type
FROM {$wpdb->posts}
WHERE post_author = %d AND post_status = 'publish'
GROUP BY post_type",
$user_id
),
ARRAY_A
);
wp_cache_set($cache_key, $data, $cache_group, HOUR_IN_SECONDS * 2);
return $data ?? [];
}
// ② 投稿更新時に関連キャッシュを無効化
add_action('save_post', function(int $post_id): void {
$author_id = get_post_field('post_author', $post_id);
// ユーザーの統計キャッシュを削除
wp_cache_delete('user_stats_' . $author_id, 'user_data');
// サイト統計キャッシュも削除
wp_cache_delete('site_stats', 'global');
});
// ③ Redisキャッシュのウォームアップ
add_action('wp_loaded', function(): void {
// よく使うオプションをプリロード
$options_to_warm = [
'blogname',
'blogdescription',
'siteurl',
'home',
];
foreach ($options_to_warm as $option) {
if (wp_cache_get($option, 'options') === false) {
$value = get_option($option);
wp_cache_set($option, $value, 'options', DAY_IN_SECONDS);
}
}
}, 5);
ステップ4:WooCommerceとのセッション競合を修正する
# WooCommerceセッションの診断
wp eval "
// WooCommerceセッション設定を確認
\$session_handler = WC()->session;
if (\$session_handler) {
echo 'Session handler: ' . get_class(\$session_handler) . PHP_EOL;
}
// セッションテーブルの確認
global \$wpdb;
\$session_count = \$wpdb->get_var(
\"SELECT COUNT(*) FROM {\$wpdb->prefix}woocommerce_sessions\"
);
echo 'Active sessions in DB: ' . \$session_count . PHP_EOL;
// Redisのセッションキーを確認
try {
\$redis = new Redis();
\$redis->connect('127.0.0.1', 6379, 2.5);
\$prefix = defined('WP_REDIS_PREFIX') ? WP_REDIS_PREFIX : '';
\$keys = \$redis->keys(\$prefix . '*:wc_session_*');
echo 'WC session keys in Redis: ' . count(\$keys) . PHP_EOL;
} catch (Exception \$e) {
echo 'Redis error: ' . \$e->getMessage() . PHP_EOL;
}
"
ステップ5:Redis接続エラーの監視と自動復旧を設定する
// functions.php: Redis監視・復旧設定
// ① Redis接続エラーを検知してログ記録
add_action('redis_object_cache_error', function(Exception $exception): void {
error_log(sprintf('[Redis] Connection error: %s', $exception->getMessage()));
// 管理者にメール通知(1時間に1回まで)
$last_notified = get_transient('redis_error_notified');
if (!$last_notified) {
wp_mail(
get_option('admin_email'),
sprintf('[%s] Redis接続エラーが発生しました', get_bloginfo('name')),
sprintf("Redis接続エラー:\n%s\n\nサーバーでRedisが起動しているか確認してください。",
$exception->getMessage())
);
set_transient('redis_error_notified', true, HOUR_IN_SECONDS);
}
});
// ② Redisキャッシュのヒット率を計測
add_action('shutdown', function(): void {
if (!defined('WP_DEBUG') || !WP_DEBUG) return;
global $wp_object_cache;
if (!method_exists($wp_object_cache, 'stats')) return;
$stats = $wp_object_cache->stats();
$hits = $stats['hits'] ?? 0;
$misses = $stats['misses'] ?? 0;
$total = $hits + $misses;
$hit_rate = $total > 0 ? round($hits / $total * 100, 1) : 0;
error_log(sprintf('[Redis] Hit rate: %s%% (%d/%d) on %s', $hit_rate, $hits, $total, $_SERVER['REQUEST_URI'] ?? '/'));
});
注意事項
- Redis Object Cacheを使用するにはサーバーにRedisがインストールされておりPHPのredis拡張またはpredis/predisライブラリが利用可能である必要があります。共有ホスティングでは利用できない場合があります
WP_REDIS_GRACEFULをtrueに設定しておくと、Redisサーバーがダウンした場合でもサイトがクラッシュせずにPHPのメモリキャッシュに自動フォールバックします。本番環境では必ず設定してください- WooCommerceのセッションをRedisで管理する場合は
WP_REDIS_UNFLUSHABLE_GROUPSにsessionsを追加してください。wp cache flushでセッションが消えるとログインユーザーのカートが空になります
まとめ
Redis Object Cache修復は①Redis接続テスト・使用メモリ・キーカウント・WordPressキャッシュヒット率を確認、②wp-config.phpでWP_REDIS_HOST・WP_REDIS_PREFIX・WP_REDIS_UNFLUSHABLE_GROUPS(セッション保護)・WP_REDIS_GRACEFULを設定、③wp_cache_get/setでカスタムグループにデータを保存・save_postフックで関連キャッシュを無効化、④WooCommerceセッション数・RedisのWCセッションキー数を確認・セッション競合を診断、⑤redis_object_cache_errorフックで接続エラー検知・管理者へのメール通知・ヒット率計測でパフォーマンス監視する手順で解決します。