【问题标题】:Best method for caching repository缓存存储库的最佳方法
【发布时间】:2014-05-20 12:10:44
【问题描述】:

我有 MVC 4 Web 应用程序,它包含一个 API 控制器,用于针对数据源进行 CRUD 操作。为了简化我尝试做的事情,我将使用电影存储库作为示例。数据源包含一个名为 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 中实现它的“最佳实践”方式。

谢谢

【问题讨论】:

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


    【解决方案1】:

    出于几个原因,我建议不要在内存中维护自己的列表。

    第一,如果您使用外键,它可能会使诸如外键之类的事情变得非常难以处理。 IE。您必须在一天结束时获得写入插入顺序以避免错误。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 2010-11-27
      • 2022-01-02
      相关资源
      最近更新 更多