나의 이해가 맞으면이 작은 흐름이 기본적인 흐름이다 당신의 목표
를 달성하는 데 도움이 될 것입니다 : 당신이 캐시 된 개체에 액세스 캐시 제공자에게 물어보고 싶은
- 개체가 null이 아닌 경우 올바른 형식으로 캐스팅하고 개체를 캐시에서 반환합니다 (이 경우 사용자 목록).
- 객체가 다음
- 합니다 (
GetAll
방법을 사용하여) 원래 소스에서 개체
- 저장 캐시
- 돌아 검색된 객체에 검색된 객체를 검색 null의 경우 최종 처리
. 최종 공정
어떤 경우
, 나는 MembershipUser
클래스 대신 사용자 지정 도메인 클래스와 함께 작동하도록 당신을 추천 할 것입니다
이 기본적인 예입니다
public IEnumerable<DomainUser> GetDomainUsers()
{
var context = HttpContext.Current;
var cache = context.Cache;
var domainUsers = cache["domainUsers"] as IEnumerable<DomainUser>;
if (domainUsers == null)
{
domainUsers = Membership.GetAllUsers().OfType<MembershipUser>().Select(x => new DomainUser
{
Email = x.Email,
Username = x.UserName
});
cache.Insert(
"domainUsers", // cache key
domainUsers, // object to cache
null, // dependencies
DateTime.Now.AddMinutes(30), // absoulute expiration
Cache.NoSlidingExpiration, // slading expiration
CacheItemPriority.High, // cache item priority
null // callback called when the cache item is removed
);
context.Trace.Warn("Data retrieved from its original source");
}
else
{
context.Trace.Warn("Data retrieved from cache");
}
return domainUsers;
}
내가 문제가 GetAllUsers 오버로드는 페이징 매개 변수를 허용합니다. GetAllUsers (int pageIndex, int pageSize, out int totalRecords). 캐시에서 데이터를 가져올 때 totalRecords 매개 변수에 값을 할당하는 방법을 모르겠습니다. –
이 표시됩니다. 그러나 귀하의 목표는 데이터베이스에서 레코드를 캐시하는 것이므로 모든 레코드를 캐시 한 다음 메모리에서 페이징을 수행하는 것이 가장 좋을 것이라고 생각합니다. ** 그러나 ** 당신이 원하는 것을 두 번 생각하는 것이 좋습니다. 캐시하려고 생각하는 경우 쿼리가 너무 오래 실행되거나 웹 서버와 데이터 서버 사이의 대기 시간이 용납 될 수없는 경우 일 수 있습니다. 그런 다음 모든 개체 묶음을 캐싱하고 메모리에서 페이징을 수행합니다. 그렇지 않다면 아마도 캐싱이 사이트 성능을 크게 향상시키지 못할 것입니다 – Jupaol