Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有一定数量项的MemoryCache_C#_Caching - Fatal编程技术网

C# 具有一定数量项的MemoryCache

C# 具有一定数量项的MemoryCache,c#,caching,C#,Caching,MemoryCache是否具有缓存固定数量项目的功能 e、 我们只对数据库中的缓存2000项感兴趣。继续向缓存添加项目时,如果超过指定的项目数,则可以删除最旧的项目 如果没有,我们是否需要使用另一个线程来定期做家务 它没有任何内置的东西来限制对象的数量。相反,它会检查正在使用的内存量,并将其与当前内存进行比较。如果超过cachememoryLit,它将删除旧项目。您还可以通过将项目设置为在一定时间后自动过期 如果您真的将其用作内存缓存,那么这两种方法都更有意义。换句话说,如果您担心内存限制和获取

MemoryCache是否具有缓存固定数量项目的功能

e、 我们只对数据库中的缓存2000项感兴趣。继续向缓存添加项目时,如果超过指定的项目数,则可以删除最旧的项目


如果没有,我们是否需要使用另一个线程来定期做家务

它没有任何内置的东西来限制对象的数量。相反,它会检查正在使用的内存量,并将其与当前内存进行比较。如果超过
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的示例实现。祝你好运

你是说?这个。此外,限制缓存中项目的实际数量似乎有些奇怪,通常您希望缓存中的项目尽可能多。空内存就是浪费内存。