2

需要有关缓存和分页的建议。场景是这样的。用户给变量范围(比如变量 X 从 x1 到 x2 和 Y 从 y1 到 y2),然后我从数据库中获取数据,然后一些逻辑对该结果进行排序并将第一页返回给用户..

对于每个用户,这些 (X & Y) 都是不同的。当用户要求第二页时问题开始我必须触发查询并再次订购结果并给出第二页结果。

这必须为每个用户请求完成..你能建议我任何缓存策略吗..(Java + mysql)如果我不清楚,请告诉我......

4

2 回答 2

0

如果您使用hibernate数据库访问权限,您可以允许second_level_cachingEhCache 自动缓存您的结果。在此处阅读更多信息

于 2013-01-14T10:27:21.210 回答
0

我假设用户可以请求例如 x1 到 x100 并获得 100 个结果,并且您希望显示分页的结果,例如 10 个结果。

我有三个建议,每个都有不同的优点。

依靠 MySQL 来做缓存。
MySQL 非常擅长缓存。如果您多次重复相同的查询,那么 MySQL 将尝试为您缓存结果,从而使后续查询非常快(它们来自内存并且不触及磁盘)。如果您查询 x1 到 x100 并只显示 x1 到 x10,那么当您想显示第 2 页时,您再次查询 x1 到 x100 MySQL 可以使用自己的内部缓存。MySQL 缓存显然使用 RAM,因此您需要确保您的 DB 服务器有足够的 RAM 才能有效地进行缓存。您将不得不估计您希望缓存多少数据,看看这是否可行。

这是一个简单的解决方案,硬件 (RAM) 相当便宜*。

内部缓存
将整个 x1 到 x100 结果保存在您的应用程序中(例如在用户会话中)并显示请求页面的相关结果。这类似于使用 MySQL 进行缓存,但您将缓存移动到更靠近需要它的位置。如果您这样做,您必须自己考虑诸如缓存管理之类的事情(例如,何时使缓存过期、管理内存使用)。您可以为此使用现有的缓存工具,例如 ehcache。

预取而不是缓存
缓存需要大量内存。如果缓存不可行,那么您可能需要考虑预取策略。如果没有缓存,您可能会遇到响应时间变慢的情况,但通过预取可以在一定程度上缓解该问题。这是在用户查看一个页面后,您对用户可能查看的其他页面(通常是下一个和上一个)进行异步查找的地方。查找可能会很慢,但您在用户请求之前就已经完成了,因此在他们需要时立即准备好。

预取是 Web 应用程序中相当常见的技术。当用户查看页面时,应用程序可以在用户查看当前页面时使用 ajax 将上一页和下一页加载到幕后的 DOM 中。当用户单击“下一个”链接时,应用程序会修改 DOM 以显示下一页,而根本无需接触服务器。对用户来说,响应似乎是即时的。

*我曾经在 MySQL 管理课程上,关于性能的主题,导师说任何人都应该做的第一件事是为服务器提供尽可能多的 RAM,因为它支持。大多数服务器都可以装满 RAM(说的是 100 Gb),而成本低于为期 3 天的性能调整课程的成本。

于 2013-01-14T11:32:43.033 回答