2011-04-28 4 views
1

나는 모든 한 페이지에라는 기능이 있습니다ASP.net은 이런 식으로 캐시 할 수 있습니까?

/// <summary> 
/// Gets the date of the latest blog entry 
/// </summary> 
public static DateTime GetNewestBlogDate() 
{ 
    DateTime ReturnDate = DateTime.Now.AddDays(30); 
    using (var db = new DataClassesDataContext()) 
    { 
     var q = (from d in db.tblBlogEntries orderby d.date descending select new {d.date}).FirstOrDefault(); 
     if (q != null) 
      ReturnDate = q.date; 
    } 
    return ReturnDate; 
} 

그것이 최신 블로그 항목의 날짜를 가져 와서는 사용자의 쿠키 값보다 큰의 경우는 블로그 옆에 new 아이콘을 표시,이 웹 사이트처럼 작동 링크.

페이지 요청 당 1 : 1이라는 페이지 요청 당이 기능을 계속 호출하는 것이 다소 낭비되는 것처럼 보입니다. 하루에 30,000 페이지 뷰, 즉 시간당 1,250 개의 데이터베이스 쿼리가 있다고 가정 해보십시오.

이 결과를 캐싱 할 수있는 방법이 있습니까? 매 시간마다 만료가 발생합니까?

마이크로 최적화라고 생각하지만, 페이지 당 10 개 정도 비슷한 기능이 있으면 가치있는 것을 추가 할 수 있습니다. 하나의 테이블로 그것을 비정규 화하여 한 번에 모두 되돌릴 수는 있지만 가능하면 관리하기가 쉽기 때문에 캐시하는 것이 좋습니다.

+0

당신은 표준 [SQL 캐시 종속성] (http://www.dotnetcurry.com/ShowArticle.aspx?ID=263) 이외의 의미 : 여기 당신이 이것을 구현하는 방법의 예? – R0MANARMY

답변

3

가 사용자 (쿠키이지만, 쿼리가 될 것 같지 않습니다)을 기반으로하지 이후로 - 당신은 그냥 표준 ASP.NET Cache를 사용할 수 있습니다.

만료가 1 시간 인 insert the result입니다. 원하는 경우 callback to automatically refresh the cache을 사용할 수도 있습니다.

MS-SQL에 저장했다고 가정하면 SqlCacheDependency을 사용하여 새 데이터를 삽입 할 때 무효화 할 수도 있습니다. 또는 삽입 코드가 잘 작성된 경우 수동으로 캐시를 무효화 할 수 있습니다.

0

반환 값을 어떻게 처리했는지 표시하지 않았습니다. 반환 된 값이 각 페이지에서 같은 방식으로 표시되는 경우 사용자 정의 컨트롤 (ASCX) 파일에 결과를 표시하기 위해 태그와 함께 코드를 배치하는 것이 좋습니다. 그런 다음 컨트롤을 캐시 할 수 있습니다.

0

CacheDuration으로 웹 메소드를 만드시겠습니까?

[WebMethod(CacheDuration=60)] 
public static DateTime GetNewestBlogDate() 
1

ASP.NET Cache 개체의 절대 만료 시간은 1 시간입니다.

public static DateTime GetNewestBlogDate() 
{    
    HttpContext context = HttpContext.Current; 
    DateTime returnDate = DateTime.Now.AddDays(30) 
    string key = "SomeUniqueKey"; // You can use something like "[UserName]_NewestBlogDate" 
    object cacheObj = context.Cache[key]; 
    if (cacheObj == null) 
    { 
     using (var db = new DataClassesDataContext()) 
     { 
      var q = (from d in db.tblBlogEntries orderby d.date descending select new { d.date }).FirstOrDefault(); 
      if (q != null) 
      { 
       returnDate = q.date; 
       context.Cache.Insert(key, returnDate, null, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration); 
      } 
     } 
    } 
    else 
    { 
     returnDate = (DateTime)cacheObj; 
    } 

    return returnDate; 
} 
관련 문제