शुरुआत के लिए मुझे बस इसे वहीं फेंक देना चाहिए, मुझे पता है कि नीचे दिया गया कोड थ्रेड सुरक्षित नहीं है (सुधार: हो सकता है)। मैं जिस चीज से जूझ रहा हूं वह एक ऐसा कार्यान्वयन है जो एक ऐसा है जिसे मैं वास्तव में परीक्षण के तहत विफल कर सकता हूं। मैं अभी एक बड़ी WCF परियोजना को फिर से शुरू कर रहा हूं जिसमें कुछ (ज्यादातर) स्थिर डेटा की आवश्यकता है और यह एक SQL डेटाबेस से आबाद है। इसे समाप्त करने और दिन में कम से कम एक बार "ताज़ा" करने की आवश्यकता है, यही कारण है कि मैं मेमोरीकैच का उपयोग कर रहा हूं।
मुझे पता है कि नीचे दिया गया कोड थ्रेड सुरक्षित नहीं होना चाहिए, लेकिन मैं इसे भारी लोड के तहत विफल करने के लिए नहीं प्राप्त कर सकता हूं और मामलों को जटिल करने के लिए एक Google खोज कार्यान्वयन को दोनों तरीकों से दिखाता है (ताले बिना और बहस के साथ संयुक्त किए बिना कि वे आवश्यक हैं या नहीं।
क्या कोई मल्टी-थ्रेडेड वातावरण में MemoryCache के ज्ञान के साथ मुझे निश्चित रूप से पता कर सकता है कि मुझे जहां उपयुक्त है वहां लॉक करने की आवश्यकता है या नहीं, ताकि हटाने के लिए एक कॉल (जिसे शायद ही कभी बुलाया जाएगा, लेकिन इसकी आवश्यकता है) पुनर्प्राप्ति या निरस्तीकरण के दौरान नहीं फेंकेगा।
public class MemoryCacheService : IMemoryCacheService
{
private const string PunctuationMapCacheKey = "punctuationMaps";
private static readonly ObjectCache Cache;
private readonly IAdoNet _adoNet;
static MemoryCacheService()
{
Cache = MemoryCache.Default;
}
public MemoryCacheService(IAdoNet adoNet)
{
_adoNet = adoNet;
}
public void ClearPunctuationMaps()
{
Cache.Remove(PunctuationMapCacheKey);
}
public IEnumerable GetPunctuationMaps()
{
if (Cache.Contains(PunctuationMapCacheKey))
{
return (IEnumerable) Cache.Get(PunctuationMapCacheKey);
}
var punctuationMaps = GetPunctuationMappings();
if (punctuationMaps == null)
{
throw new ApplicationException("Unable to retrieve punctuation mappings from the database.");
}
if (punctuationMaps.Cast<IPunctuationMapDto>().Any(p => p.UntaggedValue == null || p.TaggedValue == null))
{
throw new ApplicationException("Null values detected in Untagged or Tagged punctuation mappings.");
}
// Store data in the cache
var cacheItemPolicy = new CacheItemPolicy
{
AbsoluteExpiration = DateTime.Now.AddDays(1.0)
};
Cache.AddOrGetExisting(PunctuationMapCacheKey, punctuationMaps, cacheItemPolicy);
return punctuationMaps;
}
//Go oldschool ADO.NET to break the dependency on the entity framework and need to inject the database handler to populate cache
private IEnumerable GetPunctuationMappings()
{
var table = _adoNet.ExecuteSelectCommand("SELECT [id], [TaggedValue],[UntaggedValue] FROM [dbo].[PunctuationMapper]", CommandType.Text);
if (table != null && table.Rows.Count != 0)
{
return AutoMapper.Mapper.DynamicMap<IDataReader, IEnumerable<PunctuationMapDto>>(table.CreateDataReader());
}
return null;
}
}