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

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

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);

转载注明原文:缓存-MemoryCacheClient的工作方式与其他方式不同-保留了引用 - 代码日志