如何在ASP.NET MVC中缓存正在构建的复杂对象?

3
我正在建立一个网站,允许用户创建由多个任务组成的日程表。这些日程表和任务信息存储在数据库中。
在创建日程表时,用户可以在最终保存日程表之前添加、编辑或删除任意数量的任务。这些更改被持久化到数据库中,以便用户可以在稍后的时间恢复编辑(如果他们的会话意外结束或被中断)。
每次收到更新任务的请求时,网站调用我的数据访问层中的适当方法,然后重新请求整个日程表数据对象从数据库显示给用户。
当只有一个任务被编辑时,这似乎有些过度。我想将日程表对象及其任务列表缓存在HttpContext.Session中,并仅更新更改的单个任务(或更改日程表对象时)。
只要我得到确认编辑操作成功后才更新缓存对象,是否存在两个版本不同步的危险?
2个回答

0

如果会话被重置,可能是由于更新web.config、修改dll甚至IIS自动应用程序池回收等原因引起的,都会导致您的会话被清除。如果您有多个Web服务器,您需要担心跨多个Web服务器和数据库中的同步会话。个人建议尽量避免在会话中存储任何可以避免的内容。


你是否希望在每次编辑单个任务后,仅查询数据库以获取完整的日程对象呢?对我来说,这听起来代价太高了。 - chani
看起来这是最简单的方法,所以很可能会采用。我不确定您对于什么是慢加载页面的阈值,但如果速度不够快,您可能需要使用除数据库之外的其他东西。值得考虑的是使用分布式缓存系统,例如memcached,它可以解决我上面提到的问题。 - Shane Andrade
你说得对 - 我意识到我必须分别更新持久化副本(通过调用DAL方法)和我的本地副本(通过更新缓存对象)。忘记过早结束的会话,程序员错误可能会让我失误。我没有太多关于数据库访问的经验,所以我认为我对每个操作的开销过于谨慎了。 - chani

0
只要在成功编辑后从服务器上拉取新状态并更新缓存,那么我的两个版本不同步的风险就不会存在。
需要注意的一点是,如果你打算允许协作编辑,你就必须引入轮询机制来确保本地副本不会过期。但是根据你的描述,这种情况似乎不太可能发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接