2011-02-14 8 views
10

모든 페이지의 헤더에서 사용자 이름과 사용자 지점을 표시하고 있습니다. 이것은 부분 (데이터베이스에서 포인트를 얻음)에서 가져온 것입니다.MVC에서 부분적으로 사용자 정보를 캐시하는 방법

어떻게이 부분을 캐시하여 각 페이지에서 사용자 지점에 대한 데이터베이스를 확인하지 않아도되고, 24 시간 후에 다시 볼 수 있습니다 (캐시 만료). 또한 사용자가 로그 오프하고 다른 누군가가 로그인하면 새로운 사용자 이름과 포인트가 표시됩니다 (이전에 캐시 된 캐시가 아닌).

답변

2

이것은 사용자마다 고유하므로 영구 쿠키에 저장합니다. 따라서 사용자가 인증을하면 데이터베이스에 쿼리하여 필요한 정보를 가져오고 24 시간 내에 만료되는 영구 쿠키를 발급 할 수 있습니다. 그런 다음 부분적으로 쿠키가 있는지 여부를 확인하고이 쿠키에서 필요한 데이터를 가져오고 쿠키가 존재하지 않으면 데이터베이스에 쿼리하고 쿠키를 다시 보냅니다. 사용자가 로그 아웃 할 때 쿠키를 제거 할 수는 있지만, 쿠키가 다시 로그인 할 때 (동일한 사용자 이름 또는 다른 사용자 이름으로) 다시 데이터베이스에 쿼리하고 쿠키를 재실행 할 수 있기 때문에 쿠키를 제거 할 수 있습니다.

우리는 2011 년에 살고 있고 HTML5는 쿠키 대신 문을 두드리고 있기 때문에 아마도 HTML5 Local Storage을 사용하고 브라우저가 쿠키를 대체 할 수없는 경우 지원할 것입니다.

0

'사용자 데이터를로드하고보기에 전달하기 위해 각 작업에 동일한 코드를 작성하고 싶지는 않습니다. 대신 부분보기가 렌더링됩니다.'

그렇다면, 당신의 RenderPartialRenderAction을 변경하고이 DB에서 사용자 통계를 얻기위한 로직을 넣어보다.

하지만이 코드는 사용자가 페이지를 요청할 때마다 실행됩니다.

HttpCache (http://msdn.microsoft.com/en-us/library/aa478965.aspx)에 값을 넣으면 모든 요청에 ​​대해 db로 이동할 필요가 없습니다.

+0

이렇게하는 것이 하나의 방법입니다. 액션의 경우 24 시간마다 만료되는 'OutputCache' 속성을 지정하면 설정해야합니다. –

1

Darin이 언급했듯이 로컬 저장소가 옵션 일 수 있지만 쿠키가 더 광범위하게 지원되며 대체 메커니즘이 확실히 작동합니다.

그러나 저장해야하는 항목에 따라 중요한 정보를 쿠키 또는 복잡한 데이터에 저장하고 싶지 않으므로 추가 데이터를 추가하기 시작하면 쿠키의 데이터가 축척되지 않습니다. 추적해야하는 데이터의 나는 일반적으로 db 또는 서버 측 캐시에서 쿼리해야하는 항목을 키잉 할 때만 쿠키를 사용합니다.

NHibernate와 같은 ORM을 사용하는 경우 응용 프로그램 내 명시 적 캐싱은 데이터가 ORM의 캐싱 공급자 (사용 가능한 로컬 또는 분산 옵션)에 의해 캐시되므로 크게 걱정할 필요가 없습니다.

이것은 사용자마다 다르므로 다른 옵션은 사용자가 인증 할 때 (쿠키를 선택적으로 사용할 수 있음) 세션 정보 서버 측에이 정보를 저장하는 것입니다.

관련 문제