Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET C#:缓存数据库结果,何时/如何失效(基于每条记录)_C#_.net_Asp.net_Caching - Fatal编程技术网

ASP.NET C#:缓存数据库结果,何时/如何失效(基于每条记录)

ASP.NET C#:缓存数据库结果,何时/如何失效(基于每条记录),c#,.net,asp.net,caching,C#,.net,Asp.net,Caching,我的应用程序显示了通常很少更改的联系信息(来自大约2000个联系人记录,其中包含各种详细信息(姓名、电话号码等),这些信息构成了联系表格的基础) 但是,许多用户有权编辑此信息,如果编辑了此信息,则要求每个人都能立即看到更改 同时,我想限制每次有人查看这些信息时从数据库中重新提取这些信息,特别是因为几天过去了,没有任何变化发生 每次做一分钟的更改,我都可以重新绘制整个列表,但这似乎也不是正确的方法。因此,我正在寻找一种缓存所有内容的方法,仅对已更改的部分(例如,一条记录)进行失效和重新蚀刻,同时保

我的应用程序显示了通常很少更改的联系信息(来自大约2000个联系人记录,其中包含各种详细信息(姓名、电话号码等),这些信息构成了联系表格的基础)

但是,许多用户有权编辑此信息,如果编辑了此信息,则要求每个人都能立即看到更改

同时,我想限制每次有人查看这些信息时从数据库中重新提取这些信息,特别是因为几天过去了,没有任何变化发生

每次做一分钟的更改,我都可以重新绘制整个列表,但这似乎也不是正确的方法。因此,我正在寻找一种缓存所有内容的方法,仅对已更改的部分(例如,一条记录)进行失效和重新蚀刻,同时保留所有其他内容的缓存。页面将主要从缓存中获取信息,然后每次查看页面时,获取数据将成为一个例外


我如何进行这种设计和代码方面的工作?非常感谢您的帮助。

在每次插入和编辑操作中,您应该替换缓存条目,然后写入数据库。在向数据库发送编辑之前,还应检查以确保条目未失效(即,您的读取不正确),从而导致数据丢失


如果您真的关心数据完整性,那么可以保留缓存和数据库操作的事务日志,这样您就可以知道停机时正在进行的操作

在每次插入和编辑操作中,应替换缓存项,然后写入数据库。在向数据库发送编辑之前,还应检查以确保条目未失效(即,您的读取不正确),从而导致数据丢失


如果您真的关心数据完整性,那么可以保留缓存和数据库操作的事务日志,这样您就可以知道停机时正在进行的操作

听起来您需要为每次更新保留一个时间戳。每个记录都有一个与之相关联的时间戳

第一个应用程序加载获得每个记录,应用程序记录最大时间戳


每当保存更改时,记录的时间戳都会更新。然后,当其他用户需要加载更改时,您可以请求在客户端最后一个已知的最大时间戳之后更新的任何内容。其他用户将只获得更改。

听起来您需要保留每次更新的时间戳。每个记录都有一个与之相关联的时间戳

第一个应用程序加载获得每个记录,应用程序记录最大时间戳


每当保存更改时,记录的时间戳都会更新。然后,当其他用户需要加载更改时,您可以请求在客户端最后一个已知的最大时间戳之后更新的任何内容。其他用户将只获得更改。

具有良好的功能,允许您根据基于时间和基于通知的失效(包括从数据存储中引发的失效)设置缓存依赖项和失效。查看它

有一些很好的功能,可以让您根据基于时间和基于通知的失效(包括从数据存储中引发的失效)设置缓存依赖项和失效。查看它

我们使用了企业库缓存块来实现这一点。然而,正如Abhijeet Patel所描述的,我们在没有支持存储的情况下使用它

缓存结构为键/值对

当用户试图获取记录时,我们会检查它是否在缓存中,如果是,则从缓存返回,如果否,则从数据库获取并更新缓存


当用户更改行时,在更新数据库的同时更新缓存


请注意,当您可以控制数据的更新方式时,这种方法就起作用了。如果缓存存储在多个服务器上,您还需要做更多的工作。

我们使用企业库缓存块来完成这项工作。然而,正如Abhijeet Patel所描述的,我们在没有支持存储的情况下使用它

缓存结构为键/值对

当用户试图获取记录时,我们会检查它是否在缓存中,如果是,则从缓存返回,如果否,则从数据库获取并更新缓存


当用户更改行时,在更新数据库的同时更新缓存

请注意,当您可以控制数据的更新方式时,这种方法就起作用了。如果缓存存储在多个服务器上,您还需要做更多的工作


在每次插入和编辑操作中,应该替换缓存项,然后写入数据库

我不会这样做的。如果存在多个并发更新,则无法确保缓存替换的顺序与数据库更新的顺序相同(除非缓存更新与数据库更新是同一事务的一部分,这似乎有些过分)

相反,我会:

  • 使用从主键派生的缓存键将项目存储在缓存中

  • 在每次更新操作中,只需在数据库更新后删除缓存项即可。这样,缓存将在下次访问时用最新数据刷新


在每次插入和编辑操作中,应该替换缓存项,然后写入数据库

我不会这样做的。如果存在多个并发更新,则无法确保缓存替换的顺序与数据库更新的顺序相同(除非缓存更新与数据库更新是同一事务的一部分,这似乎有些过分)

相反,我会:

  • 使用从主键派生的缓存键将项目存储在缓存中

  • 在每次更新操作中,只需在数据库更新后删除缓存项即可。这样,缓存将在下次访问时用最新数据刷新

他们是否通过