我有一个这样的缓存服务:
public interface ICacheService {
T Get<T>(string cacheID, Func<T> getItemCallback, int cacheMinutes = 5) where T : class;
}
public class MemoryCacheService : ICacheService {
public T Get<T>(string cacheId, Func<T> getItemCallback, int cacheMinutes = 5) where T : class {
T item = MemoryCache.Default.Get(cacheId) as T;
if (item == null) {
item = getItemCallback();
MemoryCache.Default.Add(cacheId, item,
new CacheItemPolicy {AbsoluteExpiration = DateTime.Now.AddMinutes(cacheMinutes)});
}
return item;
}
}
并像这样检索:
var result = _cache.Get("mylist", () => _database.Fetch<MyList>().AsQueryable(), 600);
该列表很大,并且在每次击键的预先输入下拉列表中经常访问。而且查询条件也是动态的,比如
if (this) result = result.Where(x=> this ...)
if (that) result = result.Where(x=> that ...)
finally result.ToList()
我想知道,每次我从缓存访问列表时,系统是否会在开始构建 linq 查询之前创建数据的副本?如果是这样,就像每次击键复制一样,效率不高。或者它是否推迟了查询,因为我正在检索 AsQueryable 并构建 linq?
还有更好的选择吗?谢谢
不,MemoryCache 不会进行复制。您基本上存储对缓存中某个对象实例的引用,这就是您访问缓存中的项目时返回的内容。
我没有正式的文档链接,但在实践中发现了“困难的方法”,我仅使用返回的引用(而不复制它)意外地修改了缓存的对象。
另外,研究参考来源(http://referencesource.microsoft.com http://referencesource.microsoft.com)表明没有发生自动复制。
根据您的应用程序和需求,您可能希望确保缓存的类型实际上在设计上是不可变的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)