servicestack,Caching,servicestack" /> servicestack,Caching,servicestack" />

Caching MemoryCacheClient的工作方式与其他客户端不同-保留引用

Caching MemoryCacheClient的工作方式与其他客户端不同-保留引用,caching,servicestack,Caching,servicestack,我有一项服务,可以收集销售区域的统计数据。该服务计算所有区域的统计信息,然后缓存该集合,然后仅返回请求的区域 public object Any(RegionTotals request) { string cacheKey = "urn:RegionTotals"; //make sure master list is in the cache... base.Request.ToOptimizedResultUsingCache<RegionTo

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

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;
}
public object Any(RegionTotals请求)
{
string cacheKey=“urn:RegionTotals”;
//确保主列表在缓存中。。。
base.Request.ToOptimizedResultUsingCache(
base.Cache、cacheKey、CacheExpiryTime.DailyLoad(),()=>
{
返回RegionTotalsFactory.GetObject();
});
//然后找回他们,这是所有的团队
RegionTotals tots=base.Cache.Get(cacheKey);
//删除除请求之外的所有
tots.Records.RemoveAll(o=>o.RegionID!=request.RegionID);
返回tots;
}

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

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

如果计划对缓存值进行变异,则需要在变异前克隆实例,如果不想手动实现
ICloneable
,则可以使用以下方法对其进行序列化和反序列化:

var clone = TypeSerializer.Clone(obj);