当我测试我的Servicestack服务的更改时,我会不断烧自己,比如使用浏览器界面。我没有看到我的新变化,结果是因为数据被缓存了。所以我清除了缓存,一切都很顺利。
我想知道是否有人在他们的缓存键中包含了构建/版本号,或者在部署过程中可能会做一些事情来清除缓存。
答案 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);
}
}
}