ฉันสงสัยว่ามีความแตกต่างระหว่างMemoryCache
และHttpRuntime.Cache
ข้อใดเป็นที่ต้องการในโครงการ ASP.NET MVC
เท่าที่ฉันเข้าใจทั้งสองอย่างปลอดภัยเธรด API ตั้งแต่แรกเห็นเหมือนกันมากหรือน้อยกว่ากันดังนั้นเวลาที่จะใช้มีความแตกต่างกันอย่างไร
ฉันสงสัยว่ามีความแตกต่างระหว่างMemoryCache
และHttpRuntime.Cache
ข้อใดเป็นที่ต้องการในโครงการ ASP.NET MVC
เท่าที่ฉันเข้าใจทั้งสองอย่างปลอดภัยเธรด API ตั้งแต่แรกเห็นเหมือนกันมากหรือน้อยกว่ากันดังนั้นเวลาที่จะใช้มีความแตกต่างกันอย่างไร
คำตอบ:
HttpRuntime.Cache
รับCache
แอปพลิเคชันปัจจุบัน
MemoryCache
ชั้นคล้ายกับ ASP.NET Cache
ระดับ
MemoryCache
ชั้นจะมีคุณสมบัติหลายอย่างและวิธีการในการเข้าถึงของแคชที่จะคุ้นเคยกับคุณถ้าคุณได้ใช้ของ ASP.NET Cache
ระดับ
ความแตกต่างที่สำคัญระหว่างHttpRuntime.Cache
และMemoryCache
คือส่วนหลังได้รับการเปลี่ยนแปลงเพื่อให้สามารถใช้งานได้โดยแอปพลิเคชัน. NET Framework ที่ไม่ใช่แอปพลิเคชัน ASP.NET
สำหรับการอ่านเพิ่มเติม:
อัปเดต:
ตามความคิดเห็นของผู้ใช้บางครั้งบล็อก Jon davis ไม่ทำงานดังนั้นฉันจึงใส่บทความทั้งหมดเป็นรูปภาพโปรดดูที่
หมายเหตุ:หากยังไม่ชัดเจนให้คลิกที่ภาพหลังจากนั้นจะเปิดบนเบราว์เซอร์จากนั้นคลิกอีกครั้งเพื่อซูม :)
นี่คือบทความของ Jon Davis เพื่อรักษาความสามารถในการอ่านฉันจะตัดส่วน EntLib ที่ล้าสมัยในขณะนี้บทนำและข้อสรุป
ASP.NET หรือแอสเซมบลี System.Web.dll มีกลไกการแคช ไม่เคยมีเจตนาที่จะใช้นอกบริบทของเว็บ แต่สามารถใช้ภายนอกเว็บได้และจะดำเนินการตามพฤติกรรมการหมดอายุข้างต้นทั้งหมดในแฮชแท็กประเภทต่างๆ
หลังจากกำจัดสิ่งสกปรกบน Google ปรากฏว่ามีคนจำนวนไม่น้อยที่พูดคุยเกี่ยวกับฟังก์ชันการแคชในตัวใน. NET ได้หันมาใช้แคช ASP.NET ในโครงการที่ไม่ใช่เว็บ นี่ไม่ใช่ระบบแคชในตัวที่พร้อมใช้งานมากที่สุดและได้รับการสนับสนุนมากที่สุดใน. NET อีกต่อไป .NET 4 มี ObjectCache ซึ่งฉันจะเข้าไปในภายหลัง Microsoft ยืนกรานมาโดยตลอดว่าแคช ASP.NET ไม่ได้มีไว้สำหรับใช้งานนอกเว็บ แต่หลายคนยังคงติดอยู่ใน. NET 2.0 และ. NET 3.5 และต้องการบางสิ่งบางอย่างเพื่อทำงานร่วมกับหลาย ๆ คนแม้ว่า MSDN จะบอกอย่างชัดเจนว่า:
หมายเหตุ: คลาสแคชไม่ได้มีไว้สำหรับใช้ภายนอกแอปพลิเคชัน ASP.NET ได้รับการออกแบบและทดสอบสำหรับใช้ใน ASP.NET เพื่อจัดทำแคชสำหรับเว็บแอปพลิเคชัน ในแอปพลิเคชันประเภทอื่นเช่นแอปพลิเคชันคอนโซลหรือแอปพลิเคชัน Windows Forms การแคช ASP.NET อาจทำงานไม่ถูกต้อง
คลาสสำหรับแคช ASP.NET คือ System.Web.Caching.Cache ใน System.Web.dll อย่างไรก็ตามคุณไม่สามารถสร้างวัตถุแคชขึ้นมาใหม่ได้ คุณต้องได้รับจาก System.Web.HttpRuntime.Cache
Cache cache = System.Web.HttpRuntime.Cache;
การทำงานกับแคช ASP.NET เป็นเอกสารใน MSDN ที่นี่
ในที่สุด Microsoft ก็ใช้คลาส ObjectCache แบบนามธรรมใน. NET Framework เวอร์ชันล่าสุดและการใช้งาน MemoryCache ที่สืบทอดและใช้ ObjectCache เพื่อวัตถุประสงค์ในหน่วยความจำในการตั้งค่าที่ไม่ใช่เว็บ
System.Runtime.Caching.ObjectCache อยู่ในแอสเซมบลี System.Runtime.Caching.dll เป็นคลาสนามธรรมที่ประกาศโดยพื้นฐานแล้วว่าอินเตอร์เฟสสไตล์. NET 1.0 เดียวกันกับที่พบในแคช ASP.NET System.Runtime.Caching.MemoryCache
เป็นการนำ ObjectCache มาใช้ในหน่วยความจำและคล้ายกับแคช ASP.NET มากโดยมีการเปลี่ยนแปลงเล็กน้อย
หากต้องการเพิ่มรายการที่มีการเลื่อนหมดอายุรหัสของคุณจะมีลักษณะดังนี้:
var config = new NameValueCollection();
var cache = new MemoryCache("myMemCache", config);
cache.Add(new CacheItem("a", "b"),
new CacheItemPolicy
{
Priority = CacheItemPriority.NotRemovable,
SlidingExpiration=TimeSpan.FromMinutes(30)
});
ไม่เหมือนกับแคช ASP.NET คุณสามารถสร้างอินสแตนซ์ของวัตถุ MemoryCache ได้
หมายเหตุ: มันไม่จำเป็นต้องเป็นแบบคงที่ แต่มันควรจะเป็นนั่นคือคำแนะนำของไมโครซอฟท์ (ดูข้อควรระวังสีเหลือง)
มีการปรับปรุงเล็กน้อยเมื่อเทียบกับอินเทอร์เฟซของแคช ASP.NET เช่นความสามารถในการสมัครรับเหตุการณ์การลบโดยไม่จำเป็นต้องอยู่ที่นั่นเมื่อมีการเพิ่มรายการการแทรกที่ซ้ำซ้อน () ถูกลบออกรายการสามารถเพิ่มได้ด้วย CacheItem วัตถุที่มีตัวเริ่มต้นที่กำหนดกลยุทธ์การแคชและมีการเพิ่ม ()
จริงๆแล้วมันค่อนข้างง่ายที่จะสร้างพจนานุกรมการแคชที่มีการหมดอายุอย่างชัดเจนหรือเลื่อน (มันจะยากขึ้นมากถ้าคุณต้องการให้รายการถูกลบโดยอัตโนมัติเพื่อจุดประสงค์ในการล้างหน่วยความจำ) นี่คือสิ่งที่คุณต้องทำ:
Microsoft ต้องสนับสนุนการออกแบบดั้งเดิมเนื่องจากฐานผู้ใช้สร้างการพึ่งพา แต่ไม่ได้หมายความว่าเป็นการออกแบบที่ดี
IDictionary<K,T>
. สิ่งนี้ทำให้ง่ายต่อการบริโภคเนื่องจากอินเทอร์เฟซสามารถคาดเดาได้มากขึ้นในฐานะอินเทอร์เฟซพจนานุกรมนอกจากนี้ยังช่วยให้สามารถเข้าถึงผู้ช่วยเหลือและวิธีการขยายที่ทำงานกับ IDictionary <> ได้มากขึ้นในบรรดาสี่ตัวเลือกเหล่านี้นี่คือความชอบของฉัน ฉันได้ใช้โซลูชันการแคชขั้นพื้นฐานนี้แล้ว จนถึงตอนนี้ดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์ไม่มีจุดบกพร่องที่เป็นที่รู้จัก (โปรดติดต่อฉันด้วยความคิดเห็นด้านล่างหรือที่ jon-at-jondavis ถ้ามี !!) และฉันตั้งใจจะใช้มันในโครงการขนาดเล็กทั้งหมดของฉันที่ต้องการ แคชพื้นฐาน นี่คือ:
ลิงค์ Github: https://github.com/kroimon/ExpantedItemDictionary
ลิงก์เก่า: ExpiredItemDictionary.zip
โปรดสังเกตว่าชื่อบทความของบล็อกนี้ระบุว่า“ Simple Caching” ไม่ใช่“ Heavy-Duty Caching” หากคุณต้องการทำสิ่งที่ต้องใช้งานหนักคุณควรมองหาโซลูชันที่ทุ่มเทและขยายขนาดออกไป
MemoryCache คือสิ่งที่บอกว่ามันคือแคชที่เก็บไว้ในหน่วยความจำ
HttpRuntime.Cache (ดูhttp://msdn.microsoft.com/en-us/library/system.web.httpruntime.cache(v=vs.100).aspxและhttp://msdn.microsoft.com/en- us / library / system.web.caching.cache.aspx ) ยังคงอยู่กับสิ่งที่คุณกำหนดค่าไว้ในแอปพลิเคชันของคุณ
ดูตัวอย่างเช่น "ASP.NET 4.0: การเขียนผู้ให้บริการแคชเอาต์พุตที่กำหนดเอง" http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache -providers.aspx
MemoryCache.Default ยังสามารถใช้เป็น "สะพาน" ได้หากคุณกำลังย้ายแอป ASP.NET MVC แบบคลาสสิกไปยัง ASP.NET Core เนื่องจากไม่มี "System.Web.Caching" และ "HttpRuntime" ใน Core
ฉันยังเขียนเกณฑ์มาตรฐานขนาดเล็กเพื่อจัดเก็บbool
รายการ 20,000 ครั้ง (และเกณฑ์มาตรฐานอื่นเพื่อดึงข้อมูล) และ MemoryCache ดูเหมือนว่าจะช้าลงสองเท่า (27ms เทียบกับ 13ms - ซึ่งรวมสำหรับการทำซ้ำทั้งหมด 20k) แต่ทั้งสองอย่างเร็วมากและสิ่งนี้ อาจถูกเพิกเฉย