如何从存储库调用缓存数据

时间:2014-08-04 12:33:41

标签: c# asp.net-mvc-4 caching data-access-layer dottrace

我正在使用ASP.NET MVC作为其前端客户端的多层Web应用程序。此Web应用程序的特定页面需要很长时间才能加载。大约30秒。

我下载了dotTrace并在我的应用程序上运行了它(this tutorial之后)。我发现我申请的原因很慢。

事实证明,这是因为我所拥有的一种特殊方法会耗费大量工作(需要时间),并且相同的方法总共被调用了4次。

以下是dotTrace的截图,显示了上述内容:

dotTrace screenshot

有问题的方法是GetTasks()。因此,为了提高Web应用程序的速度,我希望缓存每个请求从GetTasks() 返回的数据。

如果我的想法是正确的,这将真正改善我所遇到的速度问题。

我的问题是,我怎样才能做到这一点?我以前从未做过这样的事情。对于每个新请求,我如何缓存从GetTasks()返回的数据,并将其用于对GetTasks()的所有后续调用。

2 个答案:

答案 0 :(得分:0)

最流行的解决方案之一是缓存结果。我可以告诉你我的解决方案。 首先安装Nuget包:LazyCache 然后你可以使用我创建了包装器的包装器:code。您可以提取和界面或其他任何内容。

然后你可以像这样使用它:

private readonly CacheManager cacheManager = new CacheManager(); 
          // or injected via ctor

public IEnumerable<Task> GetTasks()
{
    return this.cacheManager.Get("Tasks", ctx => this.taskRepository.GetAll());
}

public void AddTask(Task task)
{
    this.taskRepository.Create(task);
    /// other code

    // we need to tell the cache that it should get fresh collectiion
    this.cacheManager.Signal("Tasks"); 
}

答案 1 :(得分:0)

您是否考虑过Cache Aside pattern

您可以使用LazyCache

轻松实现它
//probably in my constructor (or use dependency injection)
this.cache = new CachingService()

public List<MyTasks> GetTasks() 
{
    return cache.GetOrAdd<List<MyTasks>>("get-tasks", () = > {
        //go and get the tasks here.
    });
}

有关详细信息,请参阅https://alastaircrabtree.com/the-easy-way-to-add-caching-to-net-application-and-make-it-faster-is-called-lazycache/