Java 有效地从服务或服务器加载数据的搜索策略?

Java 有效地从服务或服务器加载数据的搜索策略?,java,c#,performance,search,design-patterns,Java,C#,Performance,Search,Design Patterns,这个问题不是一个特定于语言的问题,它是一个与模式相关的问题,但是我想用一些我能理解的流行语言来标记它 我对高效加载数据和搜索数据(尤其是移动环境)的要求不是很有经验 我以前使用的策略是将所有内容加载到本地内存并从那里进行搜索(例如在C#中使用LINQ) 另一个策略是每次执行新搜索时重新加载数据。这样做当然没有效率,而且我们可能需要做一些更复杂的事情来将新加载的数据与现有数据(已经加载到本地内存中)同步 我能想到的最后一个策略是最难实现的,那就是在执行搜索的同时惰性地加载数据。也就是说,当执行搜索

这个问题不是一个特定于语言的问题,它是一个与模式相关的问题,但是我想用一些我能理解的流行语言来标记它

我对高效加载数据和搜索数据(尤其是移动环境)的要求不是很有经验

我以前使用的策略是将所有内容加载到本地内存并从那里进行搜索(例如在C#中使用LINQ)

另一个策略是每次执行新搜索时重新加载数据。这样做当然没有效率,而且我们可能需要做一些更复杂的事情来将新加载的数据与现有数据(已经加载到本地内存中)同步

我能想到的最后一个策略是最难实现的,那就是在执行搜索的同时惰性地加载数据。也就是说,当执行搜索时,返回的结果应该在本地缓存。在从服务/服务器获取新结果之前,搜索应该首先查看本地内存。因此,每次搜索的结果都是本地搜索和服务器搜索的组合。这里的目的是减少每次运行搜索时从服务器重新加载的数据量

以下是我能想到的实施这种战略的方法:

  • 运行搜索时,首先查看本地内存。完成此步骤将给出局部结果
  • 现在,在发送服务器端搜索请求之前,我们需要以某种方式传递已经放入结果中的内容(本地),以便在服务器端搜索时将其从结果中排除。因此,搜索方法可能包括一个参数列表,其中包含第一步找到的所有项ID。 通过该搜索请求,我们可以排除找到的结果,并只向客户端返回新项目
  • 最后一步是合并两个结果:从本地和服务器,以获得最终搜索结果,然后再显示在用户界面上
我不确定这是否是正确的方法,但我感觉不太好的是在第二步。因为我们需要将步骤1中找到的项目ID列表发送到服务器,所以如果我们有成百上千个这样的ID,那么将它们发送到服务器可能不是很有效。此外,排除如此大量项的查询可能也不高效(即使使用直接SQL或LINQ)。在这一点上我仍然感到困惑


最后,如果您有任何更好的想法和重要的实施在一些生产项目,请与我分享。我不需要任何具体的示例代码,我只需要一些想法或步骤来实现。

评论太长了

关于步骤2,您知道您可能会遇到许多问题:

数据量 随着时间的推移,您可能会积累大量的数据,因此即使设置了他们的id也会比正常的服务器答案大。最后,您可能不仅需要在客户机上缓存以前服务器的答案,还需要在服务器上缓存客户机的状态。你所做的是一种同步,所以看看有没有灵感;这是一个古老但智能的Unix工具。也可能是鼓舞人心的

基本上,通过将ID组织成一棵树,您可以轻松地在服务器和客户端之间同步信息(关于客户端已经知道的内容)。由于可能需要多个步骤,价格可能会增加延迟

运用知识 很有可能从SQL结果中排除已知对象的代价会更高,特别是当您无法轻松确定要排除的对象是否是完整答案的一部分时。不过,您可以通过对数据进行后期过滤来节省带宽

最新的 如果您的数据发生更改或被删除,您的客户可能会保留过时的数据。客户订阅相关变更是一种可能性;将(逻辑)时间戳与您的ID关联是另一种方法

总结
它可能会变得相当复杂,你应该在尝试之前测量一下。你可能会发现问题本身已经够难的了,实现这些节约甚至更难,而且收益有限。你知道这个问题,对吧?

我认为本地和远程是两个不同的数据源

  • 触发搜索时,将针对两个数据源(本地内存和服务器)启动搜索

  • 最有可能的是,本地搜索将首先生成结果,因此将结果显示给用户

  • 从服务器返回结果时,可以附加非重复结果

  • 可选-如果服务器数据已更改,并且某些结果已删除/或更改,请更新/删除本地结果并更新视图


  • 每当您对更改感兴趣时,我都会发送一条消息,这样您就可以使内存副本保持最新,并始终保持内存速度。我想知道这个问题是否可以更好地在上解决,因为它对这个站点来说似乎有点宽泛,但这并不能保证它在上解决得更好。请阅读并了解更多信息。@PeterLawrey我不确定我在这里感兴趣的内容是否可以事先知道,因为搜索是根据用户键入的关键字按需运行的。这意味着理论上所有的项目都是我感兴趣的(因为用户可以搜索/找到其中的任何一个)。所有项目可能占用数百甚至数千MB。谢谢。正确。您可能需要几GB的内存。对于服务器来说,这是相当正常的事情。通过慢速连接下载几GB到客户机并不是一个好主意,但直接从客户机联系数据库也不是一个好主意。我建议您在数据库附近有一个服务,它可以缓存您需要的所有数据,并且有一个客户端可以向它发送查询。顺便说一句,16GB的成本大约为100美元。@PeterLawrey,你的意思是搜索是针对一个有一些c语言的服务器运行的