我有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中实现它的“最佳实践”方法。
由于
答案 0 :(得分:2)
我建议不要在内存中保留自己的列表,原因有几个。
其中一个,如果您使用任何东西,可能会使像外键这样的东西很难处理。 IE浏览器。你必须在一天结束时获得写入插入顺序以避免错误。
二,您将把大量数据全部加载到系统中。您当前实现它的方式的优点是数据仅在需要时加载,而不是一次性加载所有内容并占用可能大量的内存。
最重要的是,如果您遇到服务器崩溃,在这种情况下会发生什么?或者如果网络应用程序被回收?如果您正在等待将列表写入数据源,并且突然发生其中一个,那么您将无法恢复所有数据。
HTTPContext.Current.Cache似乎是执行此操作的有效方法,但您也可以随时调查ObjectCache。
此外,在处理缓存时,请记住在更新或删除缓存时更新或刷新缓存中的对象!