我有一个返回DTO的WebService。 Web服务获取数据以从昂贵的资源填充DTO。在这个简单的示例中,几个WebService方法可能会遇到相同的ExpensiveResourceProvider方法。哪里是执行缓存以最大化缓存命中的最佳位置?在webservice或ExpensiveResourceProvider?我应该注意,ExpensiveResourceProvider中的一些数据经常更改,不应该长时间缓存。
public class MyWebService : System.Web.Services.WebService
{
public MyDTO GetObject1And2()
{
MyDTO dto12 = HttpRuntime.Cache.Get("dto12") as MyDTO;
if(dto12 == null){
dto12 = new MyDTO();
dto12.Object1 = ExpensiveResourceProvider.GetObject1();
dto12.Object2 = ExpensiveResourceProvider.GetObject2();
HttpRuntime.Cache.Insert("dto12", dto12);
}
return dto12;
}
public MyDTO GetObject2And3()
{
MyDTO dto23 = HttpRuntime.Cache.Get("dto23") as MyDTO;
if (dto23 == null)
{
dto23 = new MyDTO();
dto23.Object2 = ExpensiveResourceProvider.GetObject2();
dto23.Object3 = ExpensiveResourceProvider.GetObject3();
HttpRuntime.Cache.Insert("dto23", dto23);
}
return dto23;
}
public MyDTO GetObject1And3()
{
MyDTO dto13 = HttpRuntime.Cache.Get("dto13") as MyDTO;
if (dto13 == null)
{
dto13 = new MyDTO();
dto13.Object1 = ExpensiveResourceProvider.GetObject1();
dto13.Object3 = ExpensiveResourceProvider.GetObject3();
HttpRuntime.Cache.Insert("dto13", dto13);
}
return dto13;
}
}
public class ExpensiveResourceProvider
{
public static object GetObject1()
{
object obj1 = HttpRuntime.Cache.Get("object1") as object;
if(obj1 == null){
obj1 = new object();
HttpRuntime.Cache.Insert("object1", obj1);
}
return obj1;
}
public static object GetObject2()
{
object obj2 = HttpRuntime.Cache.Get("object2") as object;
if (obj2 == null)
{
obj2 = new object();
HttpRuntime.Cache.Insert("object2", obj2);
}
return obj2;
}
public static object GetObject3()
{
object obj3 = HttpRuntime.Cache.Get("object3") as object;
if (obj3 == null)
{
obj3 = new object();
HttpRuntime.Cache.Insert("object3", obj3);
}
return obj3;
}
}
public class MyDTO
{
public object Object1 { get; set; }
public object Object2 { get; set; }
public object Object3 { get; set; }
}
答案 0 :(得分:2)
数据的波动性是缓存它的关键。根据您的缓存机制,您将有不同的方式通知您的数据已过时且是时候刷新它。让我们假设您的缓存机制提供了一个回调委托,在这种情况下,您的委托应该与通常填充缓存的代码位于同一层(最好是相同的代码,以填充缓存开始)。说完这个后,你的缓存最好留给你的ExpensiveResourceProvider。
答案 1 :(得分:1)
回到缓存基础,你不应该考虑将两个不同层缓存策略的决策放在一起,它们是两个不同的决定。
对于消费者和服务的每个层,如果您确定消费者很有可能在数据的有效期内请求相同的信息,那么您将对其进行缓存。如果使用模式只有远程机会在数据的有效期内访问同一条数据,请不要浪费内存和CPU来缓存它。
如果您的网络服务层已经过缓存以解决最终的消费者使用模式,那就意味着您不应该在数据的有效期内再次调用资源层。
但是,您的Web服务方法似乎不是一个好的设计,它彼此重叠信息。我觉得你的问题是不是缓存的问题,这是关于如何正确分组数据的DTO对象和WS方法签名设计的问题。
但在某些情况下,请说每个Web服务方法都需要引用资源层的引用表。此时,它是资源层的独立决策,您可能决定将其缓存在资源层。
我的两分钱......