访问MemoryCache是否会创建副本?

我有这样的缓存服务:

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而推迟了查询?

还有更好的选择吗?谢谢

克里斯汀·K

不,MemoryCache不会复制。基本上,您将对某个对象实例的引用存储在缓存中,这就是您访问缓存中的项时所获得的。

我没有正式的文档链接,但是在实践中发现了“困难的方式”,在此我仅使用我获得的引用(未复制)意外地修改了缓存的对象。

另外,研究参考源(http://referencesource.microsoft.com)显示,没有自动复制发生。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Copy TBytes 是否会创建 TRUE 副本?

切片“ a”(例如,“ a [1:] == a [:-1]”)是否会创建“ a”的副本?

dict __getitem__是否会创建相应对象的副本?

Go中别名类型之间的转换是否会创建副本?

在指针上使用*运算符是否会创建副本?

使用索引/范围切片数组是否会创建数组的副本

快速的变异结构函数是否会创建新的self副本?

Swift中的字符串连接是否会创建新副本?

ToDictionary()是否创建副本或引用?

&* x操作是否创建副本?

goroutine会创建深层副本还是浅层副本?

排序值类型会创建副本吗?

numpy重塑会创建副本吗?

TensorFlow:创建图的近副本作为对原始图的扩展以测试验证数据集是否会消耗大量内存?

JS:Object.assign()是否创建深层副本或浅层副本

绑定是否创建函数的新副本?

访问组件中操作创建者返回的信息是否会破坏Flux?

标记Docker映像会创建该映像的副本吗?

取消引用参数会创建它的本地副本吗?

seq分配会创建新的seq副本吗?

将dict值设置为自身会创建无限副本

使用Python切片会创建什么类型的副本?

创建Bigtable副本集群会导致指标错误

为什么这个 lambda [=] 捕获会创建多个副本?

取消引用结构是否会返回该结构的新副本?

分配子例程的结果是否会导致数据的副本?

从bytearray转换为bytes是否会产生副本?

MarkLogic副本林是否也会参与搜索查询

如果可能,实现副本的类型是否会移动?