ServiceStack缓存包含对象/软件版本号

时间:2015-11-05 14:56:31

标签: caching servicestack

当我测试我的Servicestack服务的更改时,我会不断烧自己,比如使用浏览器界面。我没有看到我的新变化,结果是因为数据被缓存了。所以我清除了缓存,一切都很顺利。

我想知道是否有人在他们的缓存键中包含了构建/版本号,或者在部署过程中可能会做一些事情来清除缓存。

2 个答案:

答案 0 :(得分:3)

我通常只包含一个Created DateTime嵌入在Response DTO中,其中包含创建和缓存Response DTO时的Utc日期。我通常还在请求DTO中包含一个Reload标志,以指示是否要强制新缓存。

您可以在TechStacks Example中找到相关示例,例如:

[Route("/techstacks/{Slug}", Verbs = "GET")]
public class GetTechnologyStack : IReturn<GetTechnologyStackResponse>
{
    public bool Reload { get; set; }

    public string Slug { get; set; }
}

public class GetTechnologyStackResponse
{
    public DateTime Created { get; set; }

    public TechStackDetails Result { get; set; }

    public ResponseStatus ResponseStatus { get; set; }
}

基本实现如下:

public object Get(GetTechnologyStack request)
{
    var key = "{0}/{1}".Fmt(request.GetType().Name,request.Slug);
    if (request.Reload)
        Cache.Remove(key);

    return base.Request.ToOptimizedResultUsingCache(Cache, key, () =>
    {
        //...
        return new GetTechnologyStackResponse {
            Created = DateTime.UtcNow,
            Result = result,
        };
    });
}

答案 1 :(得分:2)

您的答案很好,但它需要更改入站和出站DTO,并向他可能不关心的服务的最终用户公开参数(因为它更多的是实现细节)。我希望得到的内容完全是内部的。

我最终确保将AssemblyVersion属性设置为在每次构建时更改版本/内部版本号:

[assembly: AssemblyVersion("1.0.*")]

然后我创建了以下帮助器类以将该版本号拉出为字符串:

internal class AssemblyVersion
    {
        public static string Version
        {
            get
            {
                return Assembly.GetExecutingAssembly().GetName().Version.ToString();
            }
        }

    }

最后,我将版本号添加到每个入站DTO的Cachekey属性中。现在DLL版本号存储为Cache键的一部分,DLL的新版本确保不使用旧版本缓存条目。

[DataContract]
[Route("/cachedhello/{Name}")]
public class CachedHello : IReturn<string>
{
    [DataMember]
    public string Name { get; set; }

    public string CacheKey
    {
    get
       {
          return string.Format("urn:cachedhello:nm={0}:ver={1}", Name, AssemblyVersion.Version);
       }
    }
}