คำถามติดแท็ก memorycache

9
รูปแบบการล็อกสำหรับการใช้. NET MemoryCache อย่างเหมาะสม
ฉันถือว่ารหัสนี้มีปัญหาการเกิดพร้อมกัน: const string CacheKey = "CacheKey"; static string GetCachedData() { string expensiveString =null; if (MemoryCache.Default.Contains(CacheKey)) { expensiveString = MemoryCache.Default[CacheKey] as string; } else { CacheItemPolicy cip = new CacheItemPolicy() { AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddMinutes(20)) }; expensiveString = SomeHeavyAndExpensiveCalculation(); MemoryCache.Default.Set(CacheKey, expensiveString, cip); } return expensiveString; } สาเหตุของปัญหาการเกิดพร้อมกันคือหลายเธรดสามารถรับคีย์ว่างจากนั้นพยายามแทรกข้อมูลลงในแคช วิธีใดเป็นวิธีที่สั้นและสะอาดที่สุดในการพิสูจน์รหัสพร้อมกันนี้ ฉันชอบทำตามรูปแบบที่ดีในโค้ดที่เกี่ยวข้องกับแคชของฉัน ลิงก์ไปยังบทความออนไลน์จะช่วยได้มาก UPDATE: …


11
วิธีล้าง MemoryCache
ฉันได้สร้างแคชโดยใช้คลาส MemoryCache ฉันเพิ่มบางรายการเข้าไป แต่เมื่อฉันต้องการโหลดแคชใหม่ฉันต้องการล้างมันก่อน อะไรคือวิธีที่เร็วที่สุดในการดำเนินการนี้ ฉันควรวนซ้ำรายการทั้งหมดและลบทีละรายการหรือมีวิธีที่ดีกว่านี้

7
ความปลอดภัยของเธรด MemoryCache จำเป็นต้องล็อคหรือไม่?
สำหรับผู้เริ่มต้นให้ฉันโยนมันออกไปที่นั่นฉันรู้ว่ารหัสด้านล่างไม่ปลอดภัยสำหรับเธรด (การแก้ไข: อาจจะ) สิ่งที่ฉันกำลังดิ้นรนคือการค้นหาการใช้งานที่เป็นจริงและเป็นสิ่งที่ฉันสามารถทำได้จริงภายใต้การทดสอบ ฉันกำลังปรับโครงสร้างโครงการ WCF ขนาดใหญ่ในขณะนี้ที่ต้องการข้อมูลแบบคงที่ (ส่วนใหญ่) แคชและสร้างจากฐานข้อมูล SQL จำเป็นต้องหมดอายุและ "รีเฟรช" อย่างน้อยวันละครั้งซึ่งเป็นสาเหตุที่ฉันใช้ MemoryCache ฉันรู้ว่ารหัสด้านล่างไม่ควรเป็นเธรดที่ปลอดภัย แต่ฉันไม่สามารถทำให้มันล้มเหลวภายใต้ภาระงานหนักและทำให้เรื่องซับซ้อนขึ้นการค้นหาของ Google จะแสดงการใช้งานทั้งสองวิธี (มีและไม่มีการล็อกรวมกับการอภิปรายว่าจำเป็นหรือไม่ ใครบางคนที่มีความรู้เกี่ยวกับ MemoryCache ในสภาพแวดล้อมแบบมัลติเธรดจะแจ้งให้ฉันทราบอย่างชัดเจนว่าฉันจำเป็นต้องล็อคตำแหน่งที่เหมาะสมหรือไม่เพื่อให้การเรียกเพื่อลบ (ซึ่งแทบจะไม่ถูกเรียก แต่เป็นข้อกำหนด) จะไม่ถูกโยนในระหว่างการเรียกค้น / การจัดตำแหน่งใหม่ public class MemoryCacheService : IMemoryCacheService { private const string PunctuationMapCacheKey = "punctuationMaps"; private static readonly ObjectCache Cache; private readonly IAdoNet _adoNet; static MemoryCacheService() …

7
MemoryCache ไม่เป็นไปตามขีด จำกัด หน่วยความจำในการกำหนดค่า
ฉันกำลังทำงานกับคลาส. NET 4.0 MemoryCacheในแอปพลิเคชันและพยายาม จำกัด ขนาดแคชสูงสุด แต่ในการทดสอบของฉันไม่ปรากฏว่าแคชเป็นไปตามขีด จำกัด ฉันใช้การตั้งค่าซึ่งตาม MSDNควร จำกัด ขนาดแคช: CacheMemoryLimitMegabytes : ขนาดหน่วยความจำสูงสุดเป็นเมกะไบต์ที่อินสแตนซ์ของวัตถุสามารถขยายได้ " PhysicalMemoryLimitPercentage : "เปอร์เซ็นต์ของหน่วยความจำฟิสิคัลที่แคชสามารถใช้ได้แสดงเป็นค่าจำนวนเต็มตั้งแต่ 1 ถึง 100 ค่าดีฟอลต์คือศูนย์ซึ่งบ่งชี้ว่าอินสแตนซ์ MemoryCacheจัดการหน่วยความจำ 1ของตนเองตามจำนวนหน่วยความจำที่ติดตั้งบน คอมพิวเตอร์." 1.สิ่งนี้ไม่ถูกต้องทั้งหมด - ค่าใด ๆ ที่ต่ำกว่า 4 จะถูกละเว้นและแทนที่ด้วย 4 ฉันเข้าใจว่าค่าเหล่านี้เป็นค่าโดยประมาณและไม่ใช่ข้อ จำกัด อย่างหนักเนื่องจากเธรดที่ล้างแคชจะเริ่มทำงานทุกๆ x วินาทีและยังขึ้นอยู่กับช่วงเวลาการสำรวจและตัวแปรอื่น ๆ ที่ไม่มีเอกสาร อย่างไรก็ตามแม้จะคำนึงถึงความแปรปรวนเหล่านี้ แต่ฉันก็เห็นขนาดแคชที่ไม่สอดคล้องกันอย่างมากเมื่อรายการแรกถูกขับออกจากแคชหลังจากตั้งค่าCacheMemoryLimitMegabytes และPhysicalMemoryLimitPercentageร่วมกันหรือเอกพจน์ในแอปทดสอบ เพื่อให้แน่ใจว่าฉันทำการทดสอบแต่ละครั้ง 10 ครั้งและคำนวณตัวเลขเฉลี่ย นี่คือผลลัพธ์ของการทดสอบโค้ดตัวอย่างด้านล่างบนพีซี Windows 7 …
87 c#  .net  caching  memorycache 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.