การแคชเป็นเทคโนโลยีที่จัดเก็บข้อมูล/สารสนเทศที่ใช้บ่อยไว้ในหน่วยความจำ เพื่อให้ครั้งต่อไปที่จำเป็นต้องใช้ข้อมูล/ข้อมูลเดียวกัน สามารถดึงข้อมูลจากหน่วยความจำได้โดยตรง แทนที่จะสร้างขึ้นอีกครั้งจากแอปพลิเคชัน
การแคชมีความสำคัญมากในการปรับปรุงประสิทธิภาพของ ASP เนื่องจากเพจ ASP และตัวควบคุมถูกสร้างขึ้นแบบไดนามิก นี่เป็นสิ่งสำคัญอย่างยิ่งสำหรับข้อมูลที่เกี่ยวข้องกับการโต้ตอบ โดยที่เวลาตอบสนองมีค่าสูง
ในสื่อที่ต้องเข้าถึงอย่างรวดเร็ว เช่น หน่วยความจำเข้าถึงโดยสุ่มของคอมพิวเตอร์ แคชจะวางข้อมูลที่ใช้บ่อย รันไทม์ ASP ประกอบด้วยคู่คีย์-ค่าที่เรียกว่าวัตถุ CLR ที่แคชไว้ ตั้งอยู่ภายในแอปพลิเคชันและพร้อมใช้งานผ่าน HttpContext และ System.Web.UI.Page
ในบางวิธี การแคชและการจัดเก็บออบเจ็กต์สถานะจะคล้ายกัน อย่างไรก็ตาม ข้อมูลที่จัดเก็บไว้ในออบเจ็กต์สถานะนั้นถูกกำหนดไว้แล้ว ตัวอย่างเช่น คุณสามารถคำนวณข้อมูลที่จัดเก็บไว้ในออบเจ็กต์สถานะได้ แต่ข้อมูลที่แคชไว้นั้นไม่ได้ถูกกำหนดไว้
ข้อมูลไม่สามารถใช้งานได้ในสถานการณ์ต่อไปนี้:
หากวงจรชีวิตของมันสิ้นสุดลง
หากแอปทำให้หน่วยความจำว่าง
หากไม่ได้เปลี่ยนแคชด้วยเหตุผลบางประการ
คุณสามารถใช้ตัวสร้างดัชนีเพื่อเข้าถึงรายการในแคช และสามารถควบคุมอายุการใช้งานของออบเจ็กต์ในแคชและตั้งค่าความสัมพันธ์ระหว่างออบเจ็กต์ที่แคชและทรัพยากรทางกายภาพได้
ASP มีแคชประเภทต่างๆ ดังต่อไปนี้:
แคชเอาท์พุต : แคชเอาท์พุตสามารถเก็บสำเนาของหน้าเว็บที่แสดงผลครั้งล่าสุด หรือหน้าที่บางส่วนที่ส่งไปยังไคลเอนต์ ครั้งถัดไปที่ไคลเอนต์ร้องขอเพจ สำเนาแคชของเพจจะถูกส่งไปยังไคลเอนต์แทนการสร้างเพจใหม่ ซึ่งช่วยประหยัดเวลา
การแคชข้อมูล : การแคชข้อมูลหมายถึงการแคชข้อมูลจากแหล่งข้อมูล ตราบใดที่แคชไม่ได้ถูกแทนที่ ข้อมูลจะได้รับจากแคชเมื่อมีการร้องขออีกครั้ง เมื่อแคชถูกแทนที่ ข้อมูลใหม่จะถูกดึงมาจากแหล่งข้อมูล และแคชจะถูกเติมอีกครั้ง
แคชวัตถุ : แคชวัตถุคือการแคชวัตถุของเพจ เช่น การควบคุมที่ผูกกับข้อมูล ฯลฯ ข้อมูลแคชจะถูกวางไว้ในหน่วยความจำของเซิร์ฟเวอร์
การแคชคลาส : ครั้งแรกที่มีการเรียกใช้เว็บเพจหรือบริการเว็บ คลาสของเพจที่คอมไพล์จะถูกรวบรวม แอสเซมบลีถูกแคชไว้แล้วบนเซิร์ฟเวอร์ ครั้งถัดไปที่มีการร้องขอเพจหรือบริการ แอสเซมบลีที่แคชไว้จะถูกนำมาใช้ เมื่อซอร์สโค้ดมีการเปลี่ยนแปลง CLR จะคอมไพล์แอสเซมบลีใหม่
แคชการกำหนดค่า : ข้อมูลการกำหนดค่าแอปพลิเคชันจะถูกเก็บไว้ในไฟล์การกำหนดค่า แคชการกำหนดค่าจะจัดเก็บข้อมูลการกำหนดค่าไว้ในหน่วยความจำเซิร์ฟเวอร์
ในบทช่วยสอนนี้ เราจะพิจารณาการแคชเอาต์พุต การแคชข้อมูล และการแคชอ็อบเจ็กต์
การแสดงหน้าอาจเกี่ยวข้องกับกระบวนการที่ซับซ้อนบางอย่าง เช่น การเข้าถึงฐานข้อมูล การแสดงการควบคุมที่ซับซ้อน เป็นต้น การแคชเอาต์พุตช่วยให้สามารถข้ามการเดินทางไปกลับไปยังเซิร์ฟเวอร์ได้โดยการแคชข้อมูลในหน่วยความจำ แม้แต่ทั้งหน้าก็สามารถแคชได้
คำสั่ง OutputCache มีหน้าที่รับผิดชอบในการแคชเอาต์พุต ช่วยให้สามารถแคชเอาต์พุตและให้การควบคุมพฤติกรรมของมันในระดับหนึ่ง
ไวยากรณ์ของคำสั่ง OutputCache:
<%@ ระยะเวลา OutputCache = "15" VaryByParam = "ไม่มี" %>
วางคำสั่งนี้ไว้ใต้คำสั่งหน้า สิ่งนี้จะบอกสภาพแวดล้อมว่าเพจจำเป็นต้องถูกแคชเป็นเวลา 15 วินาที ตัวจัดการเหตุการณ์การโหลดเพจต่อไปนี้จะช่วยยืนยันว่าเพจถูกแคชไว้หรือไม่
ป้องกันเป็นโมฆะ Page_Load (ผู้ส่งวัตถุ EventArgs e) { Thread.Sleep (10000); Response.Write ("หน้านี้ถูกสร้างขึ้นและแคชที่:" + DateTime.Now.ToString ());}
วิธี การ Thread.Sleep() จะหยุดกระบวนการในช่วงระยะเวลาหนึ่ง ในตัวอย่างนี้ เธรดจะหยุดทำงานเป็นเวลา 10 วินาที ดังนั้นเมื่อมีการดาวน์โหลดเพจครั้งแรก จะใช้เวลา 10 วินาที อย่างไรก็ตาม ครั้งถัดไปที่คุณรีเฟรชเพจ จะไม่ต้องใช้เวลา เนื่องจากเพจถูกดึงมาจากแคชแล้ว และจะไม่ถูกดาวน์โหลดอีก
คำสั่ง OutputCache มีคุณสมบัติดังต่อไปนี้เมื่อช่วยควบคุมลักษณะการทำงานของแคชเอาต์พุต:
คุณสมบัติ | ค่า | อธิบาย |
---|---|---|
ดิสก์แคชได้ | จริง/เท็จ | อธิบายว่าเอาต์พุตสามารถเขียนลงดิสก์ด้วยแคชได้หรือไม่ |
ไม่มีร้านค้า | จริง/เท็จ | อธิบายว่ามีการส่งส่วนหัวแคช "no store" หรือไม่ |
โปรไฟล์แคช | ชื่อสตริง | ชื่อของไฟล์การกำหนดค่าแคชที่จัดเก็บไว้ใน web.config |
VaryByParam | ไม่มี*ชื่อพารามิเตอร์ | ใช้ค่าสตริงที่คั่นด้วยอัฒภาคในคำขอ GET หรือค่าตัวแปรในคำขอ POST |
VaryByHeader | *ชื่อไฟล์ส่วนหัว | อาจเป็นสตริงคั่นด้วยเครื่องหมายอัฒภาคซึ่งระบุส่วนหัวที่ส่งโดยไคลเอ็นต์ |
แปรผันตามกำหนดเอง | สตริงที่กำหนดเองของเบราว์เซอร์ | แจ้ง ASP.NET เกี่ยวกับการเปลี่ยนแปลงแคชเอาต์พุตผ่านทางเวอร์ชันชื่อเบราว์เซอร์หรือสตริงไคลเอ็นต์ |
ที่ตั้ง | ไคลเอนต์ใด ๆ ดาวน์โหลดเซิร์ฟเวอร์สตรีมมิ่งไม่มี | ใด ๆ: หน้าอาจถูกแคชไว้ที่ใดก็ได้ ไคลเอนต์: เนื้อหาแคชมีอยู่ในเบราว์เซอร์ สตรีมดาวน์โหลด: เนื้อหาแคชถูกเก็บไว้ในสตรีมดาวน์โหลดและเซิร์ฟเวอร์ เซิร์ฟเวอร์: แคชถูกเก็บไว้ในเซิร์ฟเวอร์เท่านั้น ไม่มี: ไม่อนุญาตให้แคช |
ระยะเวลา | ตัวเลข | จำนวนวินาทีสำหรับเพจหรือการดำเนินการที่จะแคช |
มาเพิ่มกล่องข้อความและปุ่มให้กับตัวอย่างก่อนหน้า และเพิ่มตัวจัดการเหตุการณ์สำหรับปุ่มนี้
protected void btnmagic_Click(ผู้ส่งวัตถุ EventArgs e){ Response.Write("<br><br>"); Response.Write("<h2> สวัสดี " + this.txtname.Text + "</h2>") ;}
เปลี่ยนคำสั่ง OutputCache:
<%@ ระยะเวลา OutputCache = "60" VaryByParam = "txtname" % >
เมื่อโปรแกรมทำงาน ASP จะแคชเพจตามชื่อในกล่องข้อความ
ลักษณะหลักของการแคชข้อมูลคือการแคชการควบคุมแหล่งข้อมูล เราได้กล่าวถึงการควบคุมแหล่งข้อมูลที่แสดงข้อมูลจากแหล่งข้อมูล เช่น ฐานข้อมูลหรือไฟล์ XML การควบคุมเหล่านี้ได้มาจากคลาสนามธรรม DataSourceControl และมีคุณสมบัติที่สืบทอดมาต่อไปนี้สำหรับการแคช:
ระยะเวลาแคช—เวลาที่แหล่งข้อมูลแคชข้อมูล
นโยบายการหมดอายุของแคช — กำหนดลักษณะการทำงานของแคชเมื่อข้อมูลในแคชหมดอายุ
การพึ่งพาค่าแคช - กำหนดค่าควบคุมที่จะย้ายข้อมูลออกจากแคชโดยอัตโนมัติเมื่อหมดอายุ
เปิดใช้งานการแคช - คุณสามารถยืนยันได้ว่าข้อมูลถูกแคชหรือไม่
เพื่อสาธิตการแคชข้อมูล เราสร้างเว็บไซต์ใหม่และเพิ่มเว็บฟอร์มใหม่ลงไป เพิ่มตัวควบคุม SqlDataSource ลงในฐานข้อมูลที่เชื่อมต่อกับบทช่วยสอนการเข้าถึงข้อมูล
ในตัวอย่างนี้ เราเพิ่มป้ายกำกับให้กับเพจที่แสดงเวลาตอบสนองของเพจ
<asp:Label ID="lbltime" runat="server"></asp:Label>
นอกเหนือจากแท็กนี้ ทั้งหน้ายังเหมือนกับบทช่วยสอนการเข้าถึงข้อมูล เพิ่มตัวจัดการเหตุการณ์ในเพจนี้เพื่อดาวน์โหลดเวลา
โมฆะที่ได้รับการป้องกัน Page_Load (ผู้ส่งวัตถุ EventArgs e) { lbltime.Text = String.Format ("เพจที่โพสต์เมื่อ: {0}", DateTime.Now.ToLongTimeString());}
หน้าที่ออกแบบควรมีลักษณะดังนี้:
เมื่อคุณรันเพจเป็นครั้งแรก จะไม่มีอะไรแตกต่างเกิดขึ้น การแสดงป้ายกำกับ ทุกครั้งที่รีเฟรชเพจ เพจจะถูกโหลดซ้ำ และเวลาที่เปลี่ยนแปลงจะแสดงบนป้ายกำกับ
ถัดไป ตั้งค่าคุณสมบัติ EnableCaching ของตัวควบคุมแหล่งข้อมูลเป็น "true" และคุณสมบัติ Cacheduration เป็น "60" มันจะใช้แคชและแคชจะหมดอายุทุกๆ 60 วินาที
ทุกครั้งที่รีเฟรช การประทับเวลาจะเปลี่ยนไป แต่ถ้าคุณเปลี่ยนข้อมูลในตารางภายใน 60 วินาที ข้อมูลนั้นจะไม่แสดงจนกว่าแคชจะหมดอายุ
<asp:SqlDataSource ID = "SqlDataSource1" runat = "เซิร์ฟเวอร์" ConnectionString = "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString %>" ProviderName = "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString.ProviderName %>" SelectCommand = "เลือก * จาก [DotNetReferences]" EnableCaching = "จริง" CacheDuration = "60"> </asp:SqlDataSource>
การแคชอ็อบเจ็กต์ให้ความยืดหยุ่นมากกว่าเทคโนโลยีการแคชอื่นๆ คุณสามารถใช้การแคชวัตถุเพื่อวางวัตถุใดๆ ในแคชได้ ออบเจ็กต์อาจเป็นประเภทใดก็ได้ - ประเภทข้อมูล การควบคุมเครือข่าย คลาส ออบเจ็กต์การตั้งค่าข้อมูล ฯลฯ คุณสามารถเพิ่มรายการเหล่านี้ลงในแคชได้ง่ายๆ โดยการกำหนดชื่อค่าดังที่แสดงด้านล่าง:
Cache["key"] = item;
เพื่อที่จะแทรกวัตถุในแคช ASP จัดให้มีวิธีการแทรก () วิธีการนี้มีเวอร์ชันโอเวอร์โหลดสี่เวอร์ชัน มาดูกัน:
โอเวอร์โหลด | อธิบาย |
---|---|
Cache.Insert((คีย์, ค่า); | แทรกลงในแคชในรูปแบบของคู่คีย์-ค่า โดยมีลำดับความสำคัญและวงจรชีวิตเป็นค่าเริ่มต้น |
Cache.Insert (คีย์, ค่า, การอ้างอิง); | แทรกแคชลงในแคชเป็นคู่คีย์-ค่า โดยมีลำดับความสำคัญและอายุการใช้งานเริ่มต้น และการพึ่งพาแคชที่เชื่อมโยงกับไฟล์หรือเนื้อหาอื่น ดังนั้นการแก้ไขแคชจึงไม่มีการจำกัดอีกต่อไป |
Cache.Insert (คีย์, ค่า, การอ้างอิง, สัมบูรณ์หมดอายุ, เลื่อนหมดอายุ); | ระบุระยะเวลาที่ถูกต้องของการกำหนดค่าข้างต้น |
Cache.Insert (คีย์, ค่า, การอ้างอิง, สัมบูรณ์หมดอายุ, เลื่อนหมดอายุ, ลำดับความสำคัญ, onRemoveCallback); | นอกจากการกำหนดค่าแล้ว ยังอนุญาตให้ตั้งค่าลำดับความสำคัญของเนื้อหาแคชและการมอบหมาย โดยระบุวิธีการที่จะเรียกใช้เมื่อวัตถุถูกลบออก |
วงจรชีวิตแบบไดนามิกใช้เพื่อลบรายการแคชที่ไม่ถูกต้องสำหรับช่วงเวลาที่ระบุ ข้อมูลโค้ดต่อไปนี้จะบันทึกรายการแคชที่ไม่ขึ้นต่อกันโดยมีอายุการใช้งานแบบเลื่อน 10 นาที:
Cache.Insert("my_item", obj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));
สร้างเพจโดยใช้เพียงปุ่มและป้ายกำกับ เขียนโค้ดต่อไปนี้ในเหตุการณ์การโหลดหน้า:
protected void Page_Load(ผู้ส่งอ็อบเจ็กต์, EventArgs e){ if (this.IsPostBack) { lblinfo.Text += "Page Post Back.<br/>"; } else { lblinfo.Text += "page Create.<br/> "; } if (แคช["testitem"] == null) { lblinfo.Text += "กำลังสร้างรายการทดสอบ<br/>"; DateTime testItem = DateTime.Now; lblinfo.Text += "กำลังจัดเก็บรายการทดสอบในแคช "; lblinfo.Text += "เป็นเวลา 30 วินาที<br/>"; Cache.Insert("testitem", testItem, null, DateTime.Now.AddSeconds (30), TimeSpan.Zero); } else { lblinfo.Text += "กำลังดึงรายการทดสอบ<br/>"; = (DateTime)Cache["testitem"]; lblinfo.Text += "รายการทดสอบคือ: " + testItem.ToString(); lblinfo.Text += "<br/>"; />";}
เมื่อโหลดหน้านี้เป็นครั้งแรก จะแสดง:
สร้างหน้าแล้ว กำลังสร้างรายการทดสอบ กำลังจัดเก็บรายการทดสอบในแคชเป็นเวลา 30 วินาที
หากคุณคลิกปุ่มอีกครั้งภายใน 30 วินาที แม้ว่าเพจจะถูกลบไปแล้ว ตัวควบคุมป้ายกำกับจะได้รับข้อมูลจากแคช ดังที่แสดงด้านล่าง:
หน้าที่โพสต์กลับ กำลังดึงรายการทดสอบ รายการทดสอบคือ: 14-07-2010 01:25:04