缓存如何检测复杂对象更改并有效地更新缓存数据

时间:2014-03-13 14:03:04

标签: asp.net asp.net-mvc caching azure-caching

默认ASP.NET在内存缓存中使用,所以看起来它使用Dictionary<>在内部使用键值对。但是外部缓存解决方案,如Azure缓存或其他序列化数据,这使得内存解决方案中的情况有所不同。在下面的例子中,我按住List对象并更新它。

var users = new List<User>();
HttpContext.Cache.Insert("key", users);
users.Add(new User());//cached list will update itself with this insertion ?
var cachedUsers = (List<User>) HttpContext.Cache["key"];// now i got users list object reference or copied users list without inserted user ?

正如我在线上评论的那样,如果这种情况在ASP.NET的内存缓存解决方案中使用默认值,那么很明显缓存保存用户列表引用,但如果我使用Azure缓存解决方案之类的外部缓存解决方案,则答案正在改变。如果使用外部解决方案来序列化对象而不是缓存对象引用,那么下面问题的答案是什么?

  

缓存列表会自动更新吗?

     

如果我从缓存中获取数据,那么它将是用户列表对象引用还是没有插入用户的复制用户列表?

1 个答案:

答案 0 :(得分:3)

在将数据存储在内存中的缓存中,您的用户列表将会更新。显然,在序列化数据的缓存存储中,您的用户列表将包含没有新添加用户的列表。

以任何方式依赖您的缓存值在将其插入缓存后进行更新是不好的做法。如果您想稍后移动到其他类型的缓存怎么办?当您缓存的数据发生更改时,您的缓存无效,并重新填充它。不要依赖于实施。