缓存存储库的最佳方法

时间:2014-04-08 01:46:05

标签: c# asp.net-mvc caching asp.net-web-api httpcontext

我有MVC 4 Web应用程序,它包含一个针对数据源的CRUD操作的API控制器。为了简化我尝试做的事情,我将使用电影资源库作为示例。数据源包含一个类,称为MovieData(Title,Genre,MovieId等),其方法有GetAllMovies,Update,Create,GetMovieByid。调用数据源代价很高,所以我想要某种缓存,特别是在检索电影列表时。每天更新原始数据源,并且只更新一次。

实施此操作的最佳方法是什么?我应该使用HTTPContext.Current.Cache吗,还是有另一种(更好的)方式?

public class MovieController : ApiController
{
    private const string CacheKey = "MovieStore";
    private MovieDataSource movieRepository;

    public MovieController()
    {
        //this.movieRepository = new MovieDataSource();

        var ctx = HttpContext.Current;
        if (ctx != null)
        {
            if (ctx.Cache[CacheKey] == null)
            {
                this.movieRepository = new MovieDataSource();
                ctx.Cache[CacheKey] = movieRepository;
            }
        }
    }}

或者我应该简单地调用movieRepository.GetAllMovies,创建一个新列表,所有电影到该列表,然后针对该列表执行所有CRUD操作。然后在一天结束时,使用我创建的缓存列表更新数据源?这应该很简单,我只是想找到在MVC 4中实现它的“最佳实践”方法。

由于

1 个答案:

答案 0 :(得分:2)

我建议不要在内存中保留自己的列表,原因有几个。

其中一个,如果您使用任何东西,可能会使像外键这样的东西很难处理。 IE浏览器。你必须在一天结束时获得写入插入顺序以避免错误。

二,您将把大量数据全部加载到系统中。您当前实现它的方式的优点是数据仅在需要时加载,而不是一次性加载所有内容并占用可能大量的内存。

最重要的是,如果您遇到服务器崩溃,在这种情况下会发生什么?或者如果网络应用程序被回收?如果您正在等待将列表写入数据源,并且突然发生其中一个,那么您将无法恢复所有数据。

HTTPContext.Current.Cache似乎是执行此操作的有效方法,但您也可以随时调查ObjectCache。

此外,在处理缓存时,请记住在更新或删除缓存时更新或刷新缓存中的对象!