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

Caching ServiceStack REST服务的缓存策略

Caching ServiceStack REST服务的缓存策略,caching,servicestack,Caching,servicestack,我有一个简单的订单服务,希望实现缓存。以下是我的请求/响应和服务: [Route("/order", "GET")] [Route("/order/{Id}", "GET")] public class OrderRequest : IReturn<OrderResponse> { public int Id { get; set; } public string Reference1 { get; set; } public string Referen

我有一个简单的订单服务,希望实现缓存。以下是我的请求/响应和服务:

[Route("/order", "GET")]
[Route("/order/{Id}", "GET")]
public class OrderRequest : IReturn<OrderResponse>
{
    public int Id { get; set; }

    public string Reference1 { get; set; }

    public string Reference2 { get; set; }

    public DateRange CreatedOn { get; set; }

    public DateRange ProcessedOn { get; set; }

    public DateRange ShippedOn { get; set; }

    public DateRange ModifiedOn { get; set; }
}

public class OrderResponse : IHasResponseStatus 
{
    public ResponseStatus ResponseStatus { get; set; }

    public List<Order> Orders { get; set; }
}

public class OrdersService : Service
{
    public object Get(OrderRequest request)
    {
        var cacheKey = UrnId.Create<OrderResponse>(request.Id.ToString());
        return base.RequestContext.ToOptimizedResultUsingCache(base.Cache, cacheKey, new TimeSpan(0,5,0), () =>
        {
            return GetOrders(request);
        });
    }

    public OrderResponse GetOrders(OrderRequest request)
    {
        ..
    }
}
[Route(“/order”,“GET”)]
[路由(“/order/{Id}”,“GET”)]
公共类OrderRequest:IReturn
{
公共int Id{get;set;}
公共字符串引用1{get;set;}
公共字符串引用2{get;set;}
公共日期范围CreatedOn{get;set;}
在{get;set;}上处理的公共日期范围
公共日期范围ShippedOn{get;set;}
公共日期范围修饰符{get;set;}
}
公共类OrderResponse:IHasResponseStatus
{
公共响应status ResponseStatus{get;set;}
公共列表顺序{get;set;}
}
公共类OrdersService:服务
{
公共对象获取(OrderRequest请求)
{
var cacheKey=UrnId.Create(request.Id.ToString());
返回base.RequestContext.ToOptimizedResultUsingCache(base.Cache,cacheKey,新时间跨度(0,5,0),()=>
{
返回订单(请求);
});
}
public OrderResponse GetOrders(OrderRequest请求)
{
..
}
}

查看文档,会为每个缓存项生成一个唯一的键。在示例中,这通常是响应对象+项id。但是,我希望缓存不同类型的请求。例如,在我的请求中,我可以指定一个日期范围。如果我使用相同的日期范围发出相同的请求,那么我希望接收缓存副本。所以我的问题是,基于某些或所有请求参数生成唯一id的最佳方法是什么?可能在请求DTO上使用或覆盖GetHashCode?第二,如果我的缓存包含许多相同类型的对象,即OrderResponse,我可以删除给定类型的所有项吗?否则,如果修改顺序,我将不知道要删除哪些缓存对象。

cacheKey没有什么特别或重要的地方,它只需对要缓存的每个不同项目或结果集都是唯一的

如果希望它支持指定日期范围的不同缓存,则需要将变量信息添加到键中。您可以在请求DTO上使用唯一属性的组合,或者在合适的情况下使用
base.Request.PathInfo
和/或QueryString来创建一个唯一的字符串用作缓存键

第二,如果我的缓存包含许多相同类型的对象,即OrderResponse,我可以删除给定类型的所有项吗

不,每个人都不知道缓存的内容,缓存失效逻辑由客户端应用程序来管理

否则,如果修改顺序,我将不知道要删除哪些缓存对象

是的,在这种情况下,您要么设置一个过期,使其自身过期,要么使用底层缓存提供程序的任何高级功能(如果它们支持的话)。例如,如果您使用支持通配符API的
MemoryCacheClient

 cache.RemoveByPattern("cache:Orders:*");
 cache.RemoveByRegex("cache:Orders:.*);

因此,如果使用相同的前缀分层构造密钥,则可以使用单个通配符命令使所有相关缓存无效

谢谢你的帮助。我最初希望使用内存缓存。用户通常会在相同的网页之间来回移动,查看和比较一些报告。在这些情况下,两份或多份报告之间可能会提出相同的请求。因此,不是从请求DTO创建自定义散列,而是考虑将DTO序列化并使用它作为密钥,并用DTO名称预缀字符串,以便将来我可以利用通配符搜索。不确定是否对大型缓存密钥有任何惩罚?使用MemoryCacheClient时没有,它在内存中:)其他一些缓存提供程序可能对密钥长度tho有限制。