2017-12-30 2 views
2

私はキャッシングに慣れてきたことは一度もありませんが、今はちょっと試してみようとしています。私は多くのデータを返し、少し軽い、私はそうのようなデータをキャッシュしています負荷を作るためにダッシュボードを持っている:「何か」がちょうど関連モデルであるLaravelのユーザー固有のキャッシング

return cache()->rememberForever('something', function() { 
    return auth()->user()->something()->get(); 
}); 

。私はこれを行うコントローラstoreupdate方法で新記録、作成する場合:

cache()->forget('something'); 

これをすべてが完璧に動作します。しかし、別のユーザーとログインすると、以前のユーザーのすべてのキャッシュデータが明らかにダッシュボードに表示されます。

ユーザーごとにデータをキャッシュする簡単な方法はありますか?

答えて

1

あなたは個別に各ユーザーのための店のユーザーオブジェクトにこのような何かを行うことができます:

return cache()->rememberForever('something' . auth()->id(), function() { 
    return auth()->user()->something()->get(); 
}); 

を認証されたユーザのためのデータを取得するには:ユーザーあたり

cache('something' . auth()->id()); 
+1

ありがとう、私によく見える:) – Hardist

1

キャッシングは必ずしも多くを作成しません私の頭の上から考えることができます(このためにそこに奇妙なユースケースはありません)。キャッシュの目的は、特定のユーザーの「セッション」ストアではなく、すべてのユーザーのアプリケーション全体で負荷を軽減します。

まず、ユーザーごとにキャッシュする必要があるかどうかを尋ねることから始めます。おそらく、Laravel Cachingがどのように動作するかについての基本的な誤解があるのでしょうか、あるいはアプリケーションアーキテクチャがうまく設計されていないのでしょうか?私の推薦は、ユーザー関連の情報を除くすべてをキャッシュすることです。

これに役立ついくつかのパッケージがあります。私は自身のかゆみを傷つけるために作成しました。https://github.com/GeneaLabs/laravel-model-caching。このパッケージは、キャッシングを抽象化し、データベースのやり取り(ユーザー情報を除く)を自動的にキャッシュします。これはすべてのWHERE句の条件を考慮に入れるので、各クエリは異なるWHERE句に対して異なる方法でキャッシュされます。これは、ユーザーの機密データが正しいユーザーに対してのみ返されることを意味します(おそらく、ユーザーIDや他の識別子がWHERE節にあると考えられます)。

+0

まあ、私は "財政管理"パネルを作成し、私のダッシュボードに私は多くのものを読み込む。ダッシュボードが表示されるたびに多くのクエリが発生します。だから私はものをキャッシュしたい。しかし、ええ、おそらくそれはキャッシングが意味するものではなく、多分私は代替案を探す必要があります:) – Hardist

関連する問題