Redis
DrupalとRedisキーバリューストアを統合し、パフォーマンス向上のためのCache、Lock、Flood、Queueバックエンドを提供します。
redis
インストール
composer require 'drupal/redis:8.x-1.11'
概要
Redisモジュールは、DrupalとRedisキーバリューストア(およびValkeyなどの互換性のある代替製品)との包括的な統合を提供します。Redisのインメモリデータ構造ストアを活用することで、Drupalのデフォルトのデータベースベースサービスに対する高性能な代替手段を提供します。
このモジュールは3つの異なるRedisクライアントライブラリをサポートしています:PhpRedis(PHP拡張機能)、Predis(純粋なPHPライブラリ)、およびRelay(インメモリキャッシング機能を持つPHP拡張機能)。優先順位に基づいて最初に利用可能なクライアントを自動的に選択しますが、特定のクライアントを明示的に設定することもできます。
主な機能には、キャッシュタグ、データ圧縮、設定可能なTTL設定をサポートするRedisベースのCacheバックエンド、複数のWebサーバー間でリソースへのアクセスを同期するための分散Lockバックエンド、レート制限とブルートフォース保護のためのFloodバックエンド、およびバックグラウンドタスク処理のための基本的なQueueと信頼性の高いQueueの実装が含まれます。
また、Redis接続ステータス、メモリ使用量、ビンごとのキャッシュ統計、キャッシュタグの無効化、レンダーキャッシュ分析を表示する詳細な管理レポートを提供し、パフォーマンスのボトルネックを特定するのに役立ちます。
Features
- 完全なキャッシュタグ無効化サポートと自動チェックサム追跡を備えたRedis Cacheバックエンド
- メモリ使用量を削減するためのキャッシュデータのオプションgzip圧縮(設定可能なしきい値とレベル)
- 自動選択機能を備えた3つのRedisクライアントライブラリのサポート:PhpRedis、Predis、Relay
- 通常ロックと永続ロックの両方をサポートするマルチサーバー環境向けの分散Lockバックエンド
- ログイン試行やその他のブルートフォース保護のためのレート制限用Floodバックエンド
- リース時間サポートを備えたバックグラウンドタスク処理用の基本Queueバックエンド
- 配信保証のためにReliableQueueInterfaceを実装した信頼性の高いQueueバックエンド
- Redisステータス、メモリ使用量、接続クライアント数、キャッシュビンごとのキー数、キャッシュタグ統計を表示する管理レポート
- マスター/スレーブ構成によるRedis Sentinel高可用性モードのサポート
- プライマリ/レプリカ構成によるRedisレプリケーションのサポート(Predis)
- 単一のRedisインスタンスを共有するマルチサイト環境向けの設定可能なキャッシュプレフィックス
- 人間が読める形式の間隔をサポートするキャッシュビンごとの設定可能な永続TTL
- Drupalが完全に初期化される前にRedisを使用するためのブートストラップコンテナキャッシュサポート
- ChainedFastBackendのようなパフォーマンスを実現するRelayによるインメモリキャッシングサポート
- 最適化されたストレージとアンシリアライズ速度のためのigbinaryシリアライズのサポート
Use Cases
高トラフィックWebサイトのキャッシング
高トラフィックサイトでパフォーマンスを大幅に向上させるために、データベースベースのキャッシュをRedisに置き換えます。Redisのインメモリストレージは、データベースクエリと比較してサブミリ秒のキャッシュ読み取りを提供します。次のように設定します:$settings['cache']['default'] = 'cache.backend.redis' およびキャッシュタグ無効化サポートのためにexample.services.ymlをインクルード。
マルチサーバーロードバランス環境
ロードバランサーの背後にある複数のWebサーバー間で共有キャッシュバックエンドとしてRedisを使用します。すべてのサーバーが同じRedisインスタンスに接続し、キャッシュの一貫性を確保します。分散Lockバックエンドは、複数のサーバーが同時にキャッシュを再構築しようとする際の競合状態を防ぎます。
大規模なブルートフォースログイン保護
効率的なレート制限のためにデータベースFloodバックエンドをRedisに置き換えます。Redisのアトミックなインクリメント操作とTTLベースの有効期限により、データベース負荷なしで大量の認証試行を処理します。example.services.ymlまたはカスタムservices.ymlで設定します。
信頼性の高いQueueによるバックグラウンドジョブ処理
ジョブの損失が許容されないミッションクリティカルなバックグラウンド処理にRedis信頼性の高いQueueを使用します。信頼性の高いQueueはクレームされたアイテムを追跡し、ワーカーがクラッシュした場合に自動的に解放します。次のように設定します:$settings['queue_default'] = 'queue.redis_reliable'。
圧縮によるレンダーキャッシュの最適化
大きなレンダーキャッシュエントリに対してgzip圧縮を有効にして、Redisメモリ使用量を削減します。100バイトより大きいエントリを圧縮するには $settings['redis_compress_length'] = 100 を設定します。大きなHTMLフラグメントを持つpageおよびrenderキャッシュビンに特に効果的です。
共有Redisを使用したマルチサイトインストール
単一のRedisインスタンスを使用して共有インフラストラクチャ上で複数のDrupalサイトを実行します。キーの衝突を防ぎながらRedisサーバーリソースを共有するために、サイトごとに一意のキャッシュプレフィックスを設定します:$settings['cache_prefix'] = 'site1_'。
Sentinelによる高可用性Redis
本番環境で自動フェイルオーバーのためにRedis Sentinelを設定します。Sentinelホストを配列として設定し、インスタンス名を指定します:$settings['redis.connection']['host'] = ['sentinel1:5000','sentinel2:5000'] および $settings['redis.connection']['instance'] = 'mymaster'。
Relayによる最大パフォーマンス
ChainedFastBackendに似ていますがより効率的な組み込みインメモリキャッシュにより、追加のパフォーマンス向上のためにRelay PHP拡張機能を使用します。特定のビンをRelayのメモリキャッシュを使用するように設定します:$settings['redis_relay_memory_bins'] = ['container', 'bootstrap', 'config', 'discovery']。
Tips
- 最適なキャッシュエビクション動作のためにvolatile-lfuエビクションポリシーを使用します - TTLを持つ最も使用頻度の低いアイテムをエビクションしながらキャッシュタグを保護します
- テキストが多いキャッシュのメモリ使用量を大幅に削減するために $settings['redis_compress_length'] = 100 で圧縮を有効にします
- 二重無効化チェックを回避してパフォーマンスを向上させるために $settings['redis_invalidate_all_as_delete'] = TRUE を設定します
- Redisがメモリを管理するのを助けるために、pageやrenderなどの大きなキャッシュビンに特定の永続TTLを設定します:$settings['redis_perm_ttl_page'] = '3 days'
- /admin/reports/redisのRedisレポートを使用して、過剰なバリエーションを持つレンダーキャッシュエントリを特定します - これらは欠落しているキャッシュコンテキストを示しています
- Relayを使用する場合、Relayが独自の効率的なインメモリキャッシングを提供するため、config、discovery、bootstrapビンでChainedFastBackendをバイパスします
- redis_ttl_offsetを設定して、期限切れのキャッシュアイテムのリカバリを有効にしながら、Redisが最終的に古いアイテムをエビクションできるようにします
- データ損失を防ぐために、AOF永続性を有効にした別のRedisインスタンスにQueueなどの永続データを保存します
- レポートでキャッシュタグ無効化カウントを監視します - 特定のタグの高いカウントは非効率な無効化パターンを示している可能性があります
- DDEVを使用する開発環境では、ddev-redisアドオンをインストールし、settings.phpでホストを 'redis' にオーバーライドします
Technical Details
Admin Pages 1
/admin/reports/redis
包括的なRedis使用統計と接続ステータスを表示します。設定の問題に関する警告、キャッシュタグ無効化カウント、接続クライアント情報、Redisバージョンとモード、保存されているキー数、エビクションポリシー付きのメモリ使用量、サーバーの稼働時間、読み取り/書き込み統計、キャッシュビンごとのキー内訳、最もバリエーションの多いレンダーキャッシュエントリ、最も無効化されたキャッシュタグを表示します。
権限 1
Hooks 2
hook_help
現在のクライアント接続ステータスを表示するRedisモジュールのヘルプテキストを提供します。
hook_requirements
ランタイム中にRedis接続ステータスをチェックし、ステータスレポートページに報告します。
Troubleshooting 8
Redisサーバーが実行中でアクセス可能であることを確認します。/admin/reports/redisでステータスレポートを確認するか、'drush status-report' を実行して接続を確認します。redis.services.ymlがsettings.phpにインクルードされていることを確認します。PHP拡張機能(phpredis)またはライブラリ(predis)がインストールされ利用可能であることを確認します。
Redisで適切なエビクションポリシーを設定します:'maxmemory-policy volatile-lfu' が推奨されます。maxmemory制限を設定します。モジュールはすべてのキャッシュエントリにTTLを設定するため、volatileエビクションポリシーが効果的です。メモリがいっぱいになるとエラーが発生するため、'noeviction' ポリシーは避けてください。
drush crコマンドは設計上Redisストレージをフラッシュしません - キャッシュを無効化するだけです。アイテムはTTL期限切れまたはエビクションまでRedisに残ります。Redisを手動でクリアするには:'redis-cli flushall' またはDrush経由:drush php:eval "\Drupal::service('redis.factory')->getClient()->flushAll()"
キャッシュタグチェックサムサービスがexample.services.ymlまたはカスタムservices.ymlでオーバーライドされていることを確認します。'cache_tags.invalidator.checksum' サービスはRedisCacheTagsChecksumクラスを使用する必要があります。インクルード:$settings['container_yamls'][] = 'modules/contrib/redis/example.services.yml'
マネージドRedisサービスはセキュリティのためにCONFIGコマンドを無効にする場合があります。最近のモジュールバージョンはこれを適切に処理します。最新バージョンに更新してください。CONFIGアクセスなしではレポートの一部の統計が利用できない場合があります。
example.services.ymlをインクルードして、デフォルトのlockサービスをRedis Lockバックエンドに置き換えます。これにより、すべてのWebサーバー間で分散ロックが提供されます。すべてのサーバーが同じRedisインスタンスに接続していることを確認します。
デフォルトでは、Redisはデータを永続化しません(または最近のデータを失う可能性のあるRDBスナップショットを使用します)。信頼性の高いQueueには、Redis AOF永続性を設定するか、Queue用に別の永続的なRedisインスタンスを使用します。本当に重要なデータにはデータベースQueueの使用を検討してください。
Redis maxmemoryが低すぎて頻繁なエビクションが発生していないか確認します。'redis-cli INFO' を使用してメモリ使用量を確認します。大きなキャッシュエントリに対して圧縮を有効にすることを検討してください。Relayユーザーの場合、適切なビンでインメモリキャッシングが有効になっていることを確認します。Redisがリモートサーバーにある場合はネットワーク遅延を確認してください。
Security Notes 8
- 'access redis report' パーミッションを使用してRedisレポートページへのアクセスを制限します - キャッシュ構造情報が公開されます
- Redisをlocalhostまたは内部ネットワークインターフェースにのみバインドするように設定し、Redisをインターネットに直接公開しないでください
- 複数のマシンからアクセス可能なRedisインスタンスにはRedis認証(requirepass)を使用します
- Redisレプリケーションを使用する場合、すべての接続が認証を使用することを確認します
- キャッシュデータには機密情報が含まれている可能性があります - Redisアクセスがネットワークレベルで適切に保護されていることを確認します
- FloodバックエンドはIPアドレスを保存します - Redisアクセス制御がプライバシー要件に準拠していることを確認します
- 信頼できないネットワーク経由のRedis接続にはネットワーク暗号化(TLS/SSL)を検討してください
- Redis Queueに暗号化されていないシークレットを保存しないでください - 機密性の高いジョブデータには暗号化を使用します