C# 具有一定数量项的MemoryCache
MemoryCache是否具有缓存固定数量项目的功能 e、 我们只对数据库中的缓存2000项感兴趣。继续向缓存添加项目时,如果超过指定的项目数,则可以删除最旧的项目C# 具有一定数量项的MemoryCache,c#,caching,C#,Caching,MemoryCache是否具有缓存固定数量项目的功能 e、 我们只对数据库中的缓存2000项感兴趣。继续向缓存添加项目时,如果超过指定的项目数,则可以删除最旧的项目 如果没有,我们是否需要使用另一个线程来定期做家务 它没有任何内置的东西来限制对象的数量。相反,它会检查正在使用的内存量,并将其与当前内存进行比较。如果超过cachememoryLit,它将删除旧项目。您还可以通过将项目设置为在一定时间后自动过期 如果您真的将其用作内存缓存,那么这两种方法都更有意义。换句话说,如果您担心内存限制和获取
如果没有,我们是否需要使用另一个线程来定期做家务 它没有任何内置的东西来限制对象的数量。相反,它会检查正在使用的内存量,并将其与当前内存进行比较。如果超过
cachememoryLit
,它将删除旧项目。您还可以通过将项目设置为在一定时间后自动过期
如果您真的将其用作内存缓存,那么这两种方法都更有意义。换句话说,如果您担心内存限制和获取数据的成本之间的权衡,那么这些是确定何时从缓存中逐出项的好方法。所以问问你自己:
我真的想用它来做记忆卡吗?如果从数据库中只加载了2000个项目,我为什么还要在意呢
如果您担心内存开销,或者担心项目过时,那么还有其他(更好的)方法来管理缓存,而不是指定多个对象。如果您有一些自定义的理由来保持特定数量的对象在数据结构中,考虑使用不同的类。< P>另一个选项是创建一个新的MyMyCype提供程序,它为您执行对象限制管理。这将覆盖中的某些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;
}
}
}
公共类ObjectLimitMemoryCache:MemoryCache
{
private const int ObjectLimit=2000;
私有常量字符串IndexKey=“ObjectLimitIndexKey”;
public ObjectLimitMemoryCache(字符串名称、NameValueCollection配置)
:base(名称、配置)
{
}
新的公共静态ObjectLimitMemoryCache默认值{get{返回新的ObjectLimitMemoryCache(Guid.NewGuid().ToString(),new NameValueCollection());}
公共覆盖布尔添加(字符串键、对象值、DateTimeOffset absoluteExpiration、字符串区域=null)
{
尝试
{
var indexedKeys=(List)(base.Get(IndexKey)?new List();
if(base.Add(键、值、绝对过期))
{
字符串存在键;
if(string.IsNullOrEmpty(existingKey=indexedKeys.FirstOrDefault(x=>x==key)))
{
indexedKeys.Add(键);
}
if(base.GetCount()>ObjectLimit)
{
base.Remove(indexedKeys.First());
移除指数(0);
}
Add(IndexKey,indexedKeys,newdatetimeoffset(DateTime.Now.AddHours(2));
返回true;
}
返回false;
}
抓住
{
//记录一些东西和其他新奇的东西
投掷;
}
}
}
这是未经测试的代码,仅用于演示MemoryCache的示例实现。祝你好运 你是说?这个。此外,限制缓存中项目的实际数量似乎有些奇怪,通常您希望缓存中的项目尽可能多。空内存就是浪费内存。