ServiceStack缓存,以包括对象/软件版本号



当我测试对Servicestack服务的更改时,比如说使用浏览器界面时,我会不断地烧着自己。我没有看到我的新更改,原来是因为数据被缓存了。所以我清理了缓存,一切都很好。

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

我通常只会在响应DTO中嵌入一个Created DateTime,其中包含创建和缓存响应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,
        };
    });
}

您的答案很好,但它需要更改Inbound和Outbound 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);
       }
    }
}

最新更新