2017-12-30 44 views
2

캐싱을 많이 해본 적은 없지만 지금은 조금 놀아 보려고합니다. 나는 많은 데이터를 반환하고, 조금 가볍고, 내가 지금 같은 데이터를 캐싱하고 부하를 만들기 위해 대시 보드를 가지고 : "뭔가"단지 관련 모델Laravel 사용자 별 캐싱

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

. 컨트롤러에 storeupdate 방법을 새 레코드를 만들 때 난 그냥 이렇게 :

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

이를 모두 완벽하게 작동합니다. 그러나 다른 사용자와 로그인 할 때 이전 사용자의 모든 캐시 된 데이터가 분명히 대시 보드에 표시됩니다.

사용자 당 단순히 데이터를 캐시하는 쉬운 방법이 있습니까?

답변

1

당신은 개별적으로 각 사용자에 대해 저장 사용자 개체에 같은 것을 할 수 있습니다 : 사용자 당

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

감사합니다. 나에게 잘 어울립니다. – Hardist

1

캐싱이 반드시 많이하지 않습니다

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

는 인증 된 사용자에 대한 데이터를 얻을 수 나는 내 머리 꼭대기에서 생각할 수있는 감각을 가지고있다. (거기에는 이상한 유스 케이스가 없다.) 캐싱의 목적은 주어진 사용자를위한 "세션"스토어는 아니지만 모든 사용자에 대해 전체 애플리케이션의로드를 줄입니다.

사용자 당 캐시해야하는 이유는 무엇입니까? 아마도 Laravel Caching의 작동 방식에 대한 근본적인 오해가 있거나 응용 프로그램 아키텍처가 제대로 설계되지 않았습니까? 내 권장 사항은 사용자 관련 정보를 제외한 모든 것을 캐시하는 것입니다.

거기에 도움이 될 수있는 몇 가지 패키지가 있습니다. 나는 가려움증을 긁어 내었습니다. https://github.com/GeneaLabs/laravel-model-caching. 이 패키지는 캐싱 아웃을 추상화하여 사용자 상호 작용 (사용자 정보 제외)을 자동으로 캐싱합니다. 이것은 모든 WHERE 절 조건을 고려하므로 각 WHERE 절마다 각 쿼리가 다르게 캐시됩니다. 즉, 올바른 사용자에 대해서만 사용자 구분 데이터가 반환됩니다 (WHERE 절에 사용자 ID 나 다른 식별자가있는 것으로 추정 됨).

+0

글쎄, "재무 관리"패널을 만들었고 대시 보드에 물건을 많이로드했습니다. 대시 보드가 표시 될 때마다 많은 쿼리가 발생합니다. 그래서 내가 물건을 캐싱하고 싶습니다. 하지만 아마도 캐싱이 의미하는 바가 아니고 대안을 찾아야 할 것입니다. :) – Hardist