แม้ว่าตอนนี้เราจะอยู่ในยุคบรอดแบนด์และลูกแมวก็ค่อยๆ จากเราไป ในฐานะนักพัฒนาแอปพลิเคชันเว็บ เรายังคงมีความรับผิดชอบและภาระผูกพันในการเพิ่มประสิทธิภาพแอปพลิเคชันเว็บอย่างต่อเนื่องผ่านวิธีการทางเทคนิค เพื่อให้ผู้ใช้สามารถรอน้อยลงในขณะที่ท่องเว็บมากขึ้น
โชคดีที่ ASP.NET ซึ่งเป็นเทคโนโลยีการพัฒนาเว็บที่ใช้ .Net Framework ก็มีข้อดีของ .Net Framework เช่นกัน .Net Framework มอบเทคโนโลยี Cache ที่ดีให้กับเรา ทำให้เราสามารถพัฒนาแอพพลิเคชั่นเว็บที่ดีขึ้นและใช้งานง่ายขึ้น เนมสเปซ System.Web.Caching จัดเตรียมคลาส Cache ซึ่งประสิทธิผลจะขึ้นอยู่กับสามสถานการณ์ต่อไปนี้:
1. จุดเวลา (ใช้ได้ภายในจุดเวลาที่กำหนด);
2. ค่า KEY (ค่า KEY ใช้เป็นตัวระบุรายการแคช)
3. ไฟล์หรือไดเร็กทอรี (หากไฟล์หรือไดเร็กทอรีที่ระบุเปลี่ยนแปลง รายการแคชดั้งเดิมจะไม่สามารถใช้ได้)
ต่อไป ฉันจะแบ่งปันวิธีใช้แคชเพื่อปรับปรุงประสิทธิภาพของแอปพลิเคชัน ASP.NET ตามแอปพลิเคชันที่พัฒนาขึ้นจริง
ในการพัฒนา เรามักจะประสบปัญหาในการอ่านรายการบันทึก (เช่น รายการข่าวล่าสุด Top N) และบันทึกเอง (เช่น ชิ้นส่วนของข่าว) เมื่อผู้ใช้เข้าถึงข้อมูลดังกล่าวจำเป็นต้องอ่านซ้ำๆ จากฐานข้อมูลทุกครั้ง? หากคุณฉลาด คุณอาจรู้ว่าสิ่งนี้ไม่จำเป็นเลย
เพื่ออำนวยความสะดวกในการประมวลผล เราอาจออกแบบคลาส SiteCache เช่นกัน (การวาดบทเรียนจาก CSCache.cs ใน CS) และจัดเตรียมวิธีการคงที่หลายวิธีในการจัดการการเพิ่มและการลบรายการแคช
รหัส:
SiteCache.cs
1ใช้ระบบ;
2ใช้ระบบคอลเลกชัน;
3ใช้ System.Text.RegularExpressions;
4ใช้ระบบ.เว็บ;
5ใช้ System.Web.Caching;
6
7namespace Ycweb.ส่วนประกอบ
8{
9 SiteCache ระดับสาธารณะ
10 {
11 แคชส่วนตัวแบบอ่านอย่างเดียวแบบคงที่ _cache;
12 สาธารณะคงที่อ่านอย่างเดียว int DayFactor;
13 ปัจจัย int ส่วนตัวคงที่;
14 สาธารณะคงอ่านอย่างเดียว int HourFactor;
15 สาธารณะคงที่อ่านอย่างเดียว int MinuteFactor;
16
17 SiteCache แบบคงที่ ()
18 {
19ปัจจัยวัน = 17280;
ปัจจัย 20 ชั่วโมง = 720;
21 ปัจจัยนาที = 12;
22 ปัจจัย = 5;
23 _cache = HttpRuntime.แคช;
ยี่สิบสี่ }
25
26 แคชไซต์ส่วนตัว()
27 {
28 }
29
30 โมฆะสาธารณะคงที่ Clear()
31 {
32 ตัวแจงนับ IDictionaryEnumerator = _cache.GetEnumerator();
33 ในขณะที่ (ตัวแจงนับ.MoveNext())
34 {
35 _cache.Remove(ตัวแจงนับ.Key.ToString());
36}
37 }
38
39 วัตถุคงที่สาธารณะรับ (คีย์สตริง)
40 {
41 กลับ _แคช[คีย์];
42 }
43
44 โมฆะสาธารณะคงที่แทรก (คีย์สตริงวัตถุ obj)
45 {
46 แทรก (คีย์, obj, null, 1);
47 }
48
49 การแทรกโมฆะสาธารณะแบบคงที่ (คีย์สตริง, วัตถุ obj, int วินาที)
50 {
51 แทรก (คีย์, obj, null, วินาที);
52 }
53
54 การแทรกโมฆะสาธารณะแบบคงที่ (คีย์สตริง, วัตถุ obj, CacheDependency dep)
55 {
56 แทรก(คีย์, obj, dep, ปัจจัยชั่วโมง*12);
57 }
58
59 การแทรกโมฆะสาธารณะคงที่ (คีย์สตริง, วัตถุ obj, วินาที int, ลำดับความสำคัญ CacheItemPriority)
60 {
61 แทรก (คีย์, obj, null, วินาที, ลำดับความสำคัญ);
62 }
63
64 การแทรกโมฆะสาธารณะแบบคงที่ (คีย์สตริง, วัตถุ obj, CacheDependency dep, int วินาที)
65 {
66 แทรก (คีย์, obj, dep, วินาที, CacheItemPriority.Normal);
67 }
68
69 การแทรกโมฆะสาธารณะแบบคงที่ (คีย์สตริง, วัตถุ obj, CacheDependency dep, int วินาที, ลำดับความสำคัญ CacheItemPriority)
70 {
71 ถ้า (obj != null)
72 {
73 _cache.Insert(key, obj, dep, DateTime.Now.AddSeconds((double) (ปัจจัย*วินาที)), TimeSpan.Zero, ลำดับความสำคัญ, null);
74}
75 }
76
77 โมฆะสาธารณะคงที่สูงสุด (คีย์สตริงวัตถุ obj)
78 {
79 สูงสุด (คีย์, obj, null);
80}
81
82 โมฆะสาธารณะคงที่สูงสุด (คีย์สตริง, วัตถุ obj, CacheDependency dep)
83 {
84 ถ้า (obj != null)
85 {
86 _cache.Insert(คีย์, obj, dep, DateTime.MaxValue, TimeSpan.Zero, CacheItemPriority.AboveNormal, null);
87 }
88}
89
90 โมฆะสาธารณะแบบคงที่ MicroInsert (คีย์สตริง, วัตถุ obj, int SecondFactor)
91 {
92 ถ้า (obj != null)
93 {
94 _cache.Insert(คีย์, obj, null, DateTime.Now.AddSeconds((สองเท่า) (ปัจจัย*ปัจจัยที่สอง)), TimeSpan.Zero);
95 }
96 }
97
98 โมฆะสาธารณะคงลบ (คีย์สตริง)
99 {
100 _cache.Remove(คีย์);
101 }
102
103 โมฆะสาธารณะคง RemoveByPattern (รูปแบบสตริง)
104 {
105 ตัวแจงนับ IDictionaryEnumerator = _cache.GetEnumerator();
106 Regex regex1 = Regex ใหม่ (รูปแบบ RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
107 ในขณะที่ (ตัวแจงนับ.MoveNext())
108 {
109 ถ้า (regex1.IsMatch(enumerator.Key.ToString()))
110 {
111 _cache.Remove(ตัวแจงนับ.Key.ToString());
112 }
113 }
114 }
115
116 โมฆะสาธารณะคงที่ ReSetFactor (int cacheFactor)
117 {
118 ปัจจัย = ปัจจัยแคช;
119 }
120
121
122
123 }
124}
ในความเป็นจริง คลาสนี้ส่วนใหญ่ใช้คุณสมบัติแรกและที่สองของการพึ่งพาแคชที่กล่าวถึงข้างต้นเพื่อรักษารายการแคชของเราเอง
ตอนนี้เรามีคลาส SiteCache แล้ว เรามาดูวิธีการใช้งานกันดีกว่า หรืออ่านรายการข่าว TonN เป็นตัวอย่าง:
1 ชุดระเบียนคงที่สาธารณะ GetNewsSetTopN (สตริง classCode, int topN, SortPostsBy orderBy, SortOrder sortOrder, ภาษาสตริง)
2{
3 สตริง cacheKey = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}:OB:{3}:SO:{4}", language,classCode,topN.ToString( ), orderBy.ToString(),sortOrder.ToString());
4
5 // อ่านรายการแคชจากบริบท
6 RecordSet newsSet = HttpContext.Current.Items[cacheKey] เป็น RecordSet;
7 ถ้า (ชุดข่าว == null)
8 {
9 // อ่านรายการแคชจาก HttpRuntime.Cache
10 newsSet = SiteCache.Get(cacheKey) เป็น RecordSet;
11 ถ้า (ชุดข่าว == null)
12 {
13 // อ่านโดยตรงจากฐานข้อมูล
14 CommonDataProvider dp=CommonDataProvider.Instance();
15 ชุดข่าว =dp.GetNewsSetTopN(ภาษา,classCode,topN,orderBy,sortOrder);
16 //และแคชผลลัพธ์ใน HttpRuntime.Cache
17 SiteCache.Insert (cacheKey, ชุดข่าว, 60, CacheItemPriority.Normal);
18}
19
20}
21ชุดข่าวกลับ;
ยี่สิบสอง}
ด้วยวิธีนี้ไม่จำเป็นต้องเข้าถึงฐานข้อมูลซ้ำเพื่ออ่านรายการภายใน 5 นาที แน่นอนว่าบางคนจะถามว่าจะเกิดอะไรขึ้นหากรายการข่าวบางรายการถูกลบหรือแก้ไขภายใน 5 นาทีนี้ไม่สำคัญ เราสามารถลบหรือแก้ไขได้ บังคับลบรายการ Cache ตาม Cache KEY แน่นอนหากคุณรู้สึกว่าคุณไม่สนใจเรื่องเวลาของรายการเป็นพิเศษคุณจะไม่สามารถบังคับลบรายการ Cache และปล่อยให้ Cache รายการจะหมดอายุโดยอัตโนมัติตามเวลาที่กำหนด แน่นอนว่า วิธีที่ดีที่สุดคือจัดเตรียมวิธีการบังคับให้ลบรายการแคชโดยอิงตามรายการรูปแบบที่ตรงกัน ตัวอย่างเช่น:
1/***//// <สรุป>
2/// ลบรายการแคชของรายการ NewsSetTopN ที่ตรงกัน
3/// สรุป>
4 โมฆะคงที่สาธารณะ ClearNewsSetTopNCache (ภาษาสตริง, classCode สตริง, int topN)
5{
6 สตริง cacheKey = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}",ภาษา,classCode,topN.ToString());
7 SiteCache.RemoveByPattern(แคชคีย์);
8}
9.
หลังจากเผยแพร่ข่าวแล้ว ให้เรียกใช้เมธอดคงที่ ClearNewsSetTopNCache() เพื่อล้างรายการแคช TopN ดั้งเดิม เช่น:
1/***//// <สรุป>
2/// เผยแพร่ (ใหม่) ข่าว
3/// สรุป>
4/// ตัวอย่างข่าว
5///
6public int คงที่สร้าง (โพสต์ข่าว)
7{
8 สถานะ int;
9 CommonDataProvider dp=CommonDataProvider.Instance();
10 dp.CreateUpdateDeleteNews (โพสต์, DataAction.Create, สถานะออก);
11 //บังคับให้ล้างรายการแคชที่ตรงกัน
12 ClearNewsSetTopNCache (post.Language, post.ClassCode, Globals.GetSiteSetting.NewsListTopN);
13 สถานะการคืน;
14}
เพียงเท่านี้ หากมีอะไรผิดพลาด ฉันหวังว่าเพื่อนร่วมงานทุกคนจะแก้ไขฉัน
http://www.cnblogs.com/aspsir/archive/2006/07/27/461229.html