保持半静态数据新鲜的策略

时间:2009-07-23 15:42:18

标签: winforms caching

我正在开发一个winform应用程序,该应用程序将被美国和海外的团体使用,取代现有使用旧技术构建的应用程序。

由于过度回拨到美国的数据库服务器,海外旧应用程序的性能相当缓慢,所以我想在客户端上尽可能多地缓存内容。

为不经常变化的事物缓存数据的最佳方法是什么 - 但可能?如何在不将每个负载完全拉到数据的情况下防止数据过时?

7 个答案:

答案 0 :(得分:2)

快速解决方案是为数据创建某种类型的校验和,并且客户端首先只询问它。如果它是相同的,则不再需要数据,该部分是最新的。如果数据发生变化,则总和会发生变化,客户端会获得新总和以及新数据。

每次听到的声音都应该小于你的所有数据。

答案 1 :(得分:1)

如果您的数据很少更改,您可以使用sql触发器设置等效的“已更新”标志 - 然后只需在任何其他客户端 - 服务器通信上搭载该标志。如果你将插入/更新/删除触发器添加到所有半静态表和一个监视程序表,你应该很高兴。

答案 2 :(得分:1)

不确定数据集的外观如何,但是如何在数据集上计算类似SHA256的Hash并在客户端和服务器上存储该哈希值。然后在从服务器获取之前,仅获取哈希并与客户端上的本地哈希进行比较。如果哈希匹配则使用本地存储的数据集。

答案 3 :(得分:0)

你可能会保留一个SQL表函数或视图或其他轻量级的东西,它们可能有一个给定的一组对象的水印或其他指示符,可能会报告修订版ID或0表示未更改,1表示已更改,然后仅刷新那些需要更新的对象。

答案 4 :(得分:0)

我认为最好的方法是创建一个单独的表来跟踪数据。该表只包含一个表名列表,以及该表的最后一次修改。然后,您将创建一个触发器,只要在该表上发生插入/更新/删除,就会更新字段。当客户端想要检查数据时,您将检索数据并从该表中获取日期并存储它。下次客户端需要数据时,只需在该表中查找表名,获取日期并将其与您拥有的日期进行比较。如果数据库中的那个更大,则需要从服务器获取。

这种方法的唯一缺点是,对于表中的任何更改,您将转到数据库并再次检索所有数据,即使更改不会影响您的特定SQL查询。如果您的数据不经常更改,这应该不会太重要。

答案 5 :(得分:0)

如果应用程序本身可以判断数据是否有更新,请求延迟缩放可能是最简单的选择。应用程序启动时,请求数据,然后在最小刷新延迟后再次请求。如果数据未更改,请求之间的刷新延迟加倍。当没有检测到任何变化时(可能具有最大约束条件)继续加倍延迟并且您已设置为去。这是减少服务器负载的常见模式,并且在不更改架构或Web服务的情况下很容易实现客户端。

答案 6 :(得分:0)

每当要缓存的数据库或表发生更改时,您必须保持时间戳。如果存在相关表或在相似时间范围内更改的表,则可以将它们分组到具有相同时间戳的族中。

每当您需要数据时,您必须首先询问时间戳。如果未更改,请使用缓存的数据。如果已更改,请询问新数据,更新缓存,并递归询问所有祖先数据的时间戳。

校验和不起作用,因为它们可能会发生冲突,您无论如何都要请求新数据来检查是否存在冲突。旧的/已更改的标志将不起作用,因为您不知道数据何时更改,它可能在您之前的时间戳之前。每次更改后总是会增加并永不减少的版本ID也可以使用。

如果您正在使用RESTful Web服务,GET HEAD代码将仅返回HTTP标头,其中可包含时间戳。如果您的Web服务不包含时间戳,则必须定义返回时间戳的新服务。