2009-07-23 36 views
4

我正在研究一个winform应用程序,该应用程序将由美国和海外的团体使用,取代使用旧技术构建的现有应用程序。保持半静态数据保持新鲜的策略

旧的应用程序的性能海外是相当缓慢的,由于过度调用回美国的数据库服务器,所以我想缓存客户尽可能尽可能多的东西。

什么是缓存数据的最好方法是不经常更改的东西 - 但可能?如何避免数据过期而无法完全在每个负载上完成?

回答

2

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

转移只有每次听起来应该是少于所有的数据。

+0

这是行不通的。如果校验和改变数据是不同的,但如果数据改变,校验和可能不会改变。海报需要知道数据何时更改,而不是校验和。 – 2009-07-26 14:47:08

0

你可能会保持其可能对一个给定的一套可能报告修订ID的对象或更改为0不变,1水印或其他指标SQL表函数或视图或别的东西,重量轻,然后刷新只有那些需要更新的对象。

1

如果您的数据很少更改,您可以使用SQL触发器设置一个“更新”标志相当于 - 然后简单地搭载该标志上的任何其他客户端服务器通信。如果将插入/更新/删除触发器添加到所有半静态表和一个看门狗表,那么您应该很好。

0

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

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

0

如果应用程序本身可以知道是否有数据更新,请求延迟缩放可能是最简单的选择。当应用程序启动时,请求数据,然后在最小刷新延迟后再次请求。如果数据未更改,则请求之间的刷新延迟加倍。如果没有检测到更改(可能有最大限制),则继续加倍延迟,然后开始设置。这是减少服务器负载的通用模式,并且非常容易在不改变模式或Web服务的情况下实现客户端。

1

不知道如何将数据集可能看起来但如何计算散列像SHA256对数据集和存储在客户端和服务器上的哈希值。然后,在从服务器获取数据之前,仅提取哈希并与客户端上的本地哈希进行比较。如果哈希匹配使用本地存储的数据集。

+0

对不起,刚才看到luvat提到了一个类似的解决方案。我可能只是补充一点:你可以在你的服务器上有一个表,用来存储你使用的sql查询和散列。因此,当您执行请求时,首先计算查询字符串上的散列值,然后向服务器请求与查询字符串散列值相关联的数据散列值 – 2009-07-24 13:47:46

0

无论何时您想要缓存更改的数据库或表,您都必须维护一个时间戳。如果有相关的表格,或者在相似的时间段内发生变化的表格,则可以将它们分组为共享相同时间戳的家族。

每当你想你首先要问的时间戳数据。如果它没有改变,请使用缓存的数据。如果它发生了变化,请询问最新数据,更新缓存,并递归请求所有祖先数据的时间戳。

校验和不起作用,因为他们可能会发生冲突,您必须要求新数据来检查冲突。旧的/已更改的标志将不起作用,因为您不知道数据何时更改,它可能早于您之前的时间戳。版本ID在每次更改后都会增加,并且永远不会降低。

如果您使用的是RESTful Web服务,则GET HEAD代码将仅返回包含时间戳的HTTP标头。如果你的web服务不包括时间戳,你将不得不定义新的返回它们。