MemoryCache是否具有緩存固定數量項目的功能?MemoryCache具有一定數量的項目
例如我們只對來自數據庫的緩存2000項目感興趣。在向緩存中添加項目的同時,如果超過了指定的項目數,則可以刪除最舊的項目。
如果不是,我們是否必須使用另一個線程定期進行房屋管理?
MemoryCache是否具有緩存固定數量項目的功能?MemoryCache具有一定數量的項目
例如我們只對來自數據庫的緩存2000項目感興趣。在向緩存中添加項目的同時,如果超過了指定的項目數,則可以刪除最舊的項目。
如果不是,我們是否必須使用另一個線程定期進行房屋管理?
它沒有內置任何內容,將限制對象的數量。相反,它會檢查正在使用多少內存,並將其與CacheMemoryLimit
進行比較。如果超出CacheMemoryLimit
,則會丟棄較舊的項目。您也可以通過CacheItemPolicy
將項目設置爲在一段時間後自動過期。
如果您真的將它用作內存緩存,這兩種方法都會更有意義。換句話說,如果您擔心內存限制與獲取數據成本之間的折衷,這些是確定何時從緩存中驅逐項目的好方法。所以問問自己:
我真的想用這個作爲一個MemoryCache?爲什麼我甚至在乎從數據庫只加載了2000個項目?
如果您擔心內存開銷,或者如果您擔心項目過期,還有其他(更好的)管理緩存的方式,而不是指定多個對象。如果您在數據結構中保留特定數量的對象有一些自定義原因,請考慮使用不同的類。
這個。限制高速緩存中實際項目的數量似乎也很奇怪,通常您希望高速緩存中有儘可能多的項目。空內存浪費了內存。 – Matthew
另一種選擇是創建一個新的MemoryCache提供程序,它爲您執行對象限制管理。這將覆蓋一些MemoryCache方法,例如添加和移除,並在達到任意限制(例如2000個對象)後自動滾降項目。
一種這樣的實施方式可以如下所示:
public class ObjectLimitMemoryCache : MemoryCache
{
private const int ObjectLimit = 2000;
private const string IndexKey = "ObjectLimitIndexKey";
public ObjectLimitMemoryCache(string name, NameValueCollection config)
: base (name, config)
{
}
new public static ObjectLimitMemoryCache Default { get { return new ObjectLimitMemoryCache(Guid.NewGuid().ToString(), new NameValueCollection());}}
public override bool Add(string key, Object value, DateTimeOffset absoluteExpiration, string region = null)
{
try
{
var indexedKeys = (List<string>)(base.Get(IndexKey) ?? new List<string>());
if (base.Add(key, value, absoluteExpiration))
{
string existingKey;
if (string.IsNullOrEmpty(existingKey = indexedKeys.FirstOrDefault(x=>x == key)))
{
indexedKeys.Add(key);
}
if (base.GetCount() > ObjectLimit)
{
base.Remove(indexedKeys.First());
indexedKeys.RemoveAt(0);
}
base.Add(IndexKey, indexedKeys, new DateTimeOffset(DateTime.Now.AddHours(2)));
return true;
}
return false;
}
catch
{
//Log something and other fancy stuff
throw;
}
}
}
這是未測試的代碼並且僅僅意在舉例說明的MemoryCache的示例實現。祝你好運!
非常感謝您的回覆 – user1604006
你的意思是[System.Runtime.Caching.MemoryCache](http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx)? –