从昂贵的资源缓存DTO或缓存数据

时间:2010-03-01 18:44:40

标签: asp.net caching service

我有一个返回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; }
}

2 个答案:

答案 0 :(得分:2)

数据的波动性是缓存它的关键。根据您的缓存机制,您将有不同的方式通知您的数据已过时且是时候刷新它。让我们假设您的缓存机制提供了一个回调委托,在这种情况下,您的委托应该与通常填充缓存的代码位于同一层(最好是相同的代码,以填充缓存开始)。说完这个后,你的缓存最好留给你的ExpensiveResourceProvider。

答案 1 :(得分:1)

回到缓存基础,你不应该考虑将两个不同层缓存策略的决策放在一起,它们是两个不同的决定。

对于消费者和服务的每个层,如果您确定消费者很有可能在数据的有效期内请求相同的信息,那么您将对其进行缓存。如果使用模式只有远程机会在数据的有效期内访问同一条数据,请不要浪费内存和CPU来缓存它。

如果您的网络服务层已经过缓存以解决最终的消费者使用模式,那就意味着您不应该在数据的有效期内再次调用资源层。

但是,您的Web服务方法似乎不是一个好的设计,它彼此重叠信息。我觉得你的问题是不是缓存的问题,这是关于如何正确分组数据的DTO对象和WS方法签名设计的问题。

但在某些情况下,请说每个Web服务方法都需要引用资源层的引用表。此时,它是资源层的独立决策,您可能决定将其缓存在资源层。

我的两分钱......