gpt4 book ai didi

c# - 访问 MemoryCache 会创建副本吗?

转载 作者:太空狗 更新时间:2023-10-29 17:34:07 25 4
gpt4 key购买 nike

我有这样的缓存服务:

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) 表明没有自动复制发生。

根据您的应用程序和需求,您可能希望确保缓存的类型在设计上实际上是不可变的。

关于c# - 访问 MemoryCache 会创建副本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27391047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com