范围分页的数据库缓存策略

时间:2013-01-14 10:05:25

标签: java mysql database caching

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

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

必须为每个用户请求执行此操作。 你可以建议我任何缓存策略.. (Java + mysql) 如果我不清楚,请告诉我......

2 个答案:

答案 0 :(得分:0)

如果您使用hibernate进行数据库访问,则可以允许second_level_caching让EhCache自动缓存您的结果。详细了解here

答案 1 :(得分:0)

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

我有三条建议,各有各种优点。

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

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

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

预取而不是缓存
缓存需要大量内存。如果缓存不可行,那么您可能需要考虑预取策略。如果没有缓存,您可能会遇到响应速度慢的问题,但预取时问题会有所缓解。这是用户查看一个页面后,您可以异步查找用户可能查看的其他页面(通常是下一页和上一页)。查找可能很慢,但您在用户提出要求之前正在进行,以便在需要时立即就绪。

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

*我曾经参加过MySQL管理课程,关于性能主题,导师说,任何人应该做的第一件事就是尽可能多地为服务器提供RAM支持。大多数服务器都可以填充RAM(正在谈论100个Gb),而不是3天性能调整课程的成本。