セッションドライバーとしてredisを使用していますが、セッションデータを保持しながらキャッシュをクリアしたいので、基本的にユーザーはログインしたままにできます。現在の状況の再構築または処理に関する提案はありますか?
注:セッションと他のキャッシュデータに個別のredisインスタンスを使用したくありません。
デフォルトでは、redisは16個の個別のデータベースを提供しますが、laravel=そのままの状態では、セッションとキャッシュの両方にデータベース0を使用しようとします。
私たちの解決策は、データベース[0]とデータベース1をセッションに使用してRedisキャッシングを行い、php artisan cache:clear
問題を実行してセッションを解決することです。
config/database.php
を変更し、session
キーをredis
オプションに追加します。
'redis' => [
'cluster' => false,
'default' => [
'Host' => env('REDIS_Host', 'localhost'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
],
'session' => [
'Host' => env('REDIS_Host', 'localhost'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 1,
],
],
session
接続を利用するconfig/session.php
を変更し、以下を変更します。
'connection' => null,
に:
'connection' => 'session',
.env
の変更、SESSION_DRIVER
の変更:
SESSION_DRIVER=redis
次のartisanコマンドを実行して、ログイン状態を確認します。
php artisan cache:clear
ログイン状態が続く場合は、失敗します。
私はLaravelを知りませんが、一般的に最良の2つのオプションは次のとおりです。
キャッシュキーの形式を変更します。将来使用できるように、バージョン付きのキャッシュキーを使用する必要があります。したがって、インクリメントして、すべてのキーを一度に無関係にすることができます。
キャッシュを同じredisインスタンスの別のdb番号に移動します。そうすれば、後でそのdb番号に対してFLUSHDB
を実行してキャッシュをクリアすることもできます。
どちらのオプションでも、最初に実行した後、キャッシュキーの有効期限が切れていない場合は、SCAN
を使用して古いキーを削除するスクリプトを作成する必要があります。 http://redis.io/commands/scan を参照してください
余談ですが、通常キャッシュとその他のものを同じredisインスタンスに保持することは悪い考えです。キャッシュでは通常、LRUベースのエビクションを使用しますが、揮発性の低いキーとそれを混在させたくありません。
https://laravel.com/docs/5.2/redis#configuration
'redis' => [
'cluster' => false,
'default' => [
'Host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
],
Redis接続オプションには「データベース」があります。セッションとキャッシュに異なるデータベースを選択するだけです。 Redisキャッシュドライバーがフラッシュにflushallではなくflushdbを使用することを願っています:)。
Laravel Cache :: clear()は、すべてをダンプするRedis flushallコマンドを送信するため、私の経験ではあまり役に立ちません。キャッシュクラスを拡張し、クリアできるようにするキャッシュデータにインデックスを付けるカスタムセットを作成する必要があります。次に、別の関数を作成してセットを読み取り、セット内の各キーに対してRedis del()コマンドを発行します。作業コードを投稿し、必要に応じてさらに詳しく説明します
Notagolfersは、キャッシュとセッションを別のredisデータベースに分離することを提案しましたが、これは従来の呼び出しではありませんが、Redisデータベース構成スイッチを実装するためにキャッシュクラスを拡張する必要があります。