ASP.NET 1.x에서는 CacheDependency를 사용하여 캐시 종속성 전략을 구현할 수 있지만 이 클래스는 봉인되어 있으므로 이 클래스를 상속하여 자체 전략을 구현할 수 없습니다. 그러나 ASP.NET 2.0을 사용하면 이미 이 클래스에서 고유한 캐시 종속성 클래스를 파생시킬 수 있습니다.
페이지를 디자인하고 블로그 홈페이지에서 최신 게시물 정보를 얻어야 한다고 가정해 보겠습니다. 성능 향상을 위해 블로그 파크의 홈 페이지가 업데이트될 때만 페이지 데이터가 재생성되고, 그렇지 않으면 캐시에서 직접 가져오기를 바랍니다. 달성하는 방법?
1. BlogCacheDependency 클래스를 설계
하고 먼저 분석합니다. 우선 이 클래스는 CacheDependency에서 파생되어야 하며 Cache의 Insert 메서드에서 사용되거나 AggregateDependency 클래스에서 사용될 수 있습니다.
둘째, 블로그파크에서 제공하는 RSS와 페이지 디자인 측면에서 RSS 데이터를 캐시에 저장하고 이를 표시할 때 스타일 변환을 사용할 수 있다. 종속성을 확인할 때 현재 RSS가 웹사이트의 RSS와 동일한지 여부만 비교하면 됩니다.
더 중요한 질문은 RSS 데이터를 언제 확인하고 비교하는가입니다. 요청할 때마다? 분명히 그렇지 않습니다. 이는 캐시를 사용하지 않는 것과 거의 같으며 실제로는 불필요한 부담을 더합니다. 요청하지 않고 체크인하는 것은 어떻습니까? 타이머를 사용하여 이를 제어하고 업데이트가 있는지 정기적으로 확인할 수 있습니다. 업데이트가 있으면 변경 사항의 종속성을 알립니다.
CacheDependency 클래스에 HasChanged 속성이 있다는 것은 알고 있지만 BlogCacheDependency는 종속성 변경을 감지할 때 기본 클래스에 어떻게 알릴까요? 이것이 ASP.NET 2.0의 CacheDependency 클래스에 있는 새로운 NotifyDependencyChanged 메서드의 임무입니다.
또한 재사용을 용이하게 하기 위해 BlogCacheDependency 클래스에는 얻으려는 RSS 데이터의 URL을 저장할 피드 데이터가 있어야 합니다. 사용 중에 새로 고침 속도를 쉽게 조정할 수 있는 시간 간격도 있습니다.
이제 실제 구현 코드를 살펴보겠습니다.
1public class BlogCacheDependency : CacheDependency
2{
3 개인 타이머 _tickTimer;
4 개인 int _timeInterval;
5 개인 XPathNavigator _rss;
6 개인 문자열 _feed;
7
8 공개 XPathNavigator RSS
9 {
10 얻다
11 {
12 반환 _rss;
13}
14}
15
16 공개 BlogCacheDependency(문자열 피드, int timeInterval)
17 {
18 _피드 = 피드;
19 _timeInterval = 시간간격;
20 _rss = GetRSS();
21 _tickTimer = 새 타이머(new TimerCallback(CheckDependencyCallback),
22 이, _timeInterval * 1000, _timeInterval * 1000);
스물셋 }
스물넷
25 개인 XPathNavigator GetRSS()
26 {
27 XPathDocument rssDoc = 새 XPathDocument(_feed);
28 return rssDoc.CreateNavigator();
29 }
30
31 공개 무효 CheckDependencyCallback(객체 전송자)
32 {
33 BlogCacheDependency bcd = BlogCacheDependency로 보낸 사람;
34 XPathNavigator newRSS = GetRSS();
35 if (newRSS.OuterXml != _rss.OuterXml)
36 {
37 bcd.NotifyDependencyChanged(bcd, EventArgs.Empty);
38 }
39 }
40
41 보호된 재정의 무효 종속성Dispose()
42 {
43 _tickTimer = null;
44 베이스.DependencyDispose();
45 }
46}
47
48
여기에서 BlogCacheDependency의 생성자는 _tickTimer를 사용하여 업데이트를 정기적으로 확인하는 메커니즘을 구현합니다. 이는 설정된 시간 간격에 따라 CheckDependencyCallback 메서드를 호출합니다.
CheckDependencyCallback 메서드는 두 RSS 정보를 비교합니다. 서로 다른 경우 NotifyDependencyChanged 메서드가 호출되어 해당 캐시 종속성이 변경되었으며 캐시의 데이터가 지워져야 함을 기본 클래스에 알립니다.
2. 페이지 디자인
다음은 BlogCacheDependency를 사용하는 방법을 보여주는 페이지 코드(요약)입니다.
1<script runat="server">
2 protected void Page_Load(객체 전송자, EventArgs e)
3 {
4 문자열 피드 = " http://www.cnblogs.com/RSS.aspx ";
5 if (캐시[피드] == null)
6 {
7 BlogCacheDependency bcd = new BlogCacheDependency(피드, 600);
8 캐시.삽입(피드, bcd.RSS, bcd);
9 Label1.Text = "현재 데이터가 방금 획득되었으며 캐시로 업데이트되었습니다!";
10}
그 외 11개
12 {
13 Label1.Text = "현재 데이터는 캐시에서 가져옵니다!";
14}
15 RssXml.XPathNavigator = System.Xml.XPath.XPathNavigator로 캐시[피드];
16 RssXml.TransformSource = "translate.xsl";
17}
18</script>
19
20<본문>
21 <form id="form1" runat="서버">
22 블로그 파크 최신 게시물:
23 <br />
24 <asp:Xml ID="RssXml" runat="서버" />
25 <br />
26 <asp:Label ID="Label1" runat="server" ForeColor="red" />
27 </form>
28</body>
29
이 예에서는 블로그 파크 홈페이지의 최신 게시물 목록에 접근하기 위해 설정된 시간 간격은 600초입니다. 즉, 업데이트 상태를 10분마다 확인합니다.
주목할 만한 몇 가지 사항:
1. 사용된 RssXml.XPathNavigator 특성에 주의하십시오. 일부 사람들은 RssXml.Document가 사용되지 않는 이유를 궁금해할 수 있습니다. 실제로 Document 속성은 .NET 2.0에서 폐지되었습니다. 권장되는 대체 속성은 이전 BlogCacheDependency 클래스에서 볼 수 있듯이 XPathDocument.CreateNavigator()에서 생성된다는 것을 알 수 있습니다. XPathDocument 클래스는 읽기 전용 고속 캐시를 제공하는데 이는 분명히 이 예제에 더 적합합니다.
2. BlogCacheDependency 클래스에 있는 dependencyDispose 메서드의 목적이 무엇인지 생각해 보십시오. Dispose 메서드와 어떻게 다릅니까? 업데이트를 확인할 때 종속성 변경이 발견되었지만 요청이 다시 전송되지 않은 경우 CheckDependencyCallback 메서드가 간격을 두고 계속 실행됩니까? 이것이 실제로 그렇다면 완전히 중복되지 않을까요? 변경 사항이 한 번 감지되면 다시 확인할 필요가 없기 때문입니다. 그리고 로그를 추적하거나 기록하면 실제로 종속성 변경 사항이 발견되는 한 다시 확인되지 않는다는 것을 알 수 있습니다. 비밀은 무엇입니까? 곰곰이 생각해보면 NotifyDependencyChanged 메소드에는 수수께끼가 많다는 것을 알 수 있을 것이고, 실제로 dependencyDispose 메소드가 있는 이유가 바로 여기에 있다는 것이다. 그 안에 담긴 디자인 아이디어는 음미할 가치가 있습니다.
3. 페이지에 사용된 번역.xsl에 대해서는 더 이상 말하지 않겠습니다
. 주요 코드는 다음과 같습니다:
1<xsl:template match="channel">
2 <div>
3 <xsl:for-each select="항목">
4 <a>
5 <xsl:속성 이름="href">
6 <xsl:value-of select="link"/>
7 </xsl:속성>
8 <xsl:value-of select="제목"/>
9 </a>
10 <br />
11 </xsl:for-each>
12 </div>
13</xsl:템플릿>
4. 실행:
초기 실행의 스크린샷은 다음과 같습니다.
블로그 가든 홈페이지에 새 게시물이 나타나지 않으면 페이지를 새로 고치고 항상 다음 페이지를 표시합니다.
새로운 게시물이 올라오면 새로고침하면 이전 사진이 나타납니다.
5. 좀 더 발전하고 싶나요?
당신이 나만큼 게으르거나 나보다 게으른 경우, 자바스크립트를 사용하여 페이지를 자동으로 새로 고치는 작은 함수를 작성한 다음 페이지를 장식하거나 웹사이트에서 사용할 수 있도록 재사용 가능한 구성 요소로 패키징하는 것을 고려할 수 있습니다. 이 기계에서 "내가 가장 관심 있는 콘텐츠 컬렉션"과 같은 것을 만들고 싶습니까? 음, 효과는 꽤 좋을 것 같아요.