web-dev-qa-db-ja.com

セッションデータを保持しながらredisキャッシュをクリアする方法:Laravel 5

セッションドライバーとしてredisを使用していますが、セッションデータを保持しながらキャッシュをクリアしたいので、基本的にユーザーはログインしたままにできます。現在の状況の再構築または処理に関する提案はありますか?

:セッションと他のキャッシュデータに個別のredisインスタンスを使用したくありません。

10
rajangupta

はじめに

デフォルトでは、redisは16個の個別のデータベースを提供しますが、laravel=そのままの状態では、セッションとキャッシュの両方にデータベース0を使用しようとします。

私たちの解決策は、データベース[0]とデータベース1をセッションに使用してRedisキャッシングを行い、php artisan cache:clear問題を実行してセッションを解決することです。

1.セッションRedis接続のセットアップ

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,
   ],
],

2. session接続を利用する

config/session.phpを変更し、以下を変更します。

'connection' => null,

に:

'connection' => 'session',

3. Redisをセッションドライバーとして使用する

.envの変更、SESSION_DRIVERの変更:

SESSION_DRIVER=redis

4.テスト

次のartisanコマンドを実行して、ログイン状態を確認します。

php artisan cache:clear

ログイン状態が続く場合は、失敗します。

26
CharlieJade

私はLaravelを知りませんが、一般的に最良の2つのオプションは次のとおりです。

  1. キャッシュキーの形式を変更します。将来使用できるように、バージョン付きのキャッシュキーを使用する必要があります。したがって、インクリメントして、すべてのキーを一度に無関係にすることができます。

  2. キャッシュを同じredisインスタンスの別のdb番号に移動します。そうすれば、後でそのdb番号に対してFLUSHDBを実行してキャッシュをクリアすることもできます。

どちらのオプションでも、最初に実行した後、キャッシュキーの有効期限が切れていない場合は、SCANを使用して古いキーを削除するスクリプトを作成する必要があります。 http://redis.io/commands/scan を参照してください

余談ですが、通常キャッシュとその他のものを同じredisインスタンスに保持することは悪い考えです。キャッシュでは通常、LRUベースのエビクションを使用しますが、揮発性の低いキーとそれを混在させたくありません。

3
Not_a_Golfer

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を使用することを願っています:)。

2
my-nick

Laravel Cache :: clear()は、すべてをダンプするRedis flushallコマンドを送信するため、私の経験ではあまり役に立ちません。キャッシュクラスを拡張し、クリアできるようにするキャッシュデータにインデックスを付けるカスタムセットを作成する必要があります。次に、別の関数を作成してセットを読み取り、セット内の各キーに対してRedis del()コマンドを発行します。作業コードを投稿し、必要に応じてさらに詳しく説明します

Notagolfersは、キャッシュとセッションを別のredisデータベースに分離することを提案しましたが、これは従来の呼び出しではありませんが、Redisデータベース構成スイッチを実装するためにキャッシュクラスを拡張する必要があります。

0
Mike Miller