gpt4 book ai didi

caching - MemoryCacheClient 的工作方式与其他不同 - 保留引用

转载 作者:行者123 更新时间:2023-12-01 13:42:19 27 4
gpt4 key购买 nike

我有一项服务可以提取销售区域的统计信息。该服务计算所有区域的统计数据,然后缓存该集合,然后仅返回请求的区域。

public object Any(RegionTotals request)
{
string cacheKey = "urn:RegionTotals";

//make sure master list is in the cache...
base.Request.ToOptimizedResultUsingCache<RegionTotals>(
base.Cache, cacheKey, CacheExpiryTime.DailyLoad(), () =>
{
return RegionTotalsFactory.GetObject();
});

//then retrieve them. This is all teams
RegionTotals tots = base.Cache.Get<RegionTotals>(cacheKey);

//remove all except requested
tots.Records.RemoveAll(o => o.RegionID != request.RegionID);

return tots;
}

我发现当我使用 MemoryCacheClient(作为我用于单元测试的 StaticAppHost 的一部分)时,tots.Records.RemoveAll(...) 行实际上会影响缓存中的对象。这意味着我获取缓存对象,删除行,然后缓存不再包含所有区域。因此,针对任何其他区域对该服务的后续调用不会返回任何记录。如果我使用我的普通缓存,当然 Cache.Get() 会在缓存中创建对象的新副本,并且从该对象中删除记录不会影响缓存。

最佳答案

这是因为内存缓存不会增加任何序列化开销,只是将您的对象实例存储在内存中。而当您使用任何其他 Caching Providers您的值首先被序列化,然后发送到远程缓存提供程序,然后在检索到它时将其反序列化,因此它永远不会重复使用相同的对象实例。

如果你计划改变缓存的值,你需要在改变它们之前克隆实例,如果你不想手动实现 ICloneable 你可以序列化和反序列化它们:

var clone = TypeSerializer.Clone(obj);

关于caching - MemoryCacheClient 的工作方式与其他不同 - 保留引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38976299/

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