【问题标题】:data base caching strategies for range pagination范围分页的数据库缓存策略
【发布时间】:2012-12-28 06:57:49
【问题描述】:

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

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

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

【问题讨论】:

  • 还有一点要提的是,变量范围可以与其他用户请求重叠。

标签: java mysql database caching


【解决方案1】:

我假设用户可以请求例如 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。大多数服务器都可以用 3 天性能调优课程的成本填充 RAM(说的是 100 Gb)。

【讨论】:

  • 我会选择你的第二个选项 .. 触发查询没什么大不了的,逻辑顺序是什么消磨时间.. 我想缓存 x100 结果并可以提供下一页.. 预取不会在我的情况下工作..因为我必须加载 100 个结果以使它们按顺序排列。 .so 在下一页我仍然需要前 10 个才能进行正确排序,否则无法知道第一页中有哪 10 个结果...
  • 我想在前面提到我在问题评论中提到的另一件事。这个变量范围可以相互重叠,所以如果我可以有一些数据结构来以范围格式存储这个信息,这样对于其他用户我也可以映射到其他用户结果..我知道我的语言在什么方面模糊中解释了我的问题.. 请让我知道哪些部分是不可理解的..
【解决方案2】:

如果您使用hibernate 进行数据库访问,您可以允许second_level_caching 让EhCache 自动缓存您的结果。阅读更多关于here

【讨论】:

  • 但我仍然必须对查询结果进行排序才能找到下一页。我可以有一些标记,或者可以存储 ID 列表吗??
  • 使用休眠,您仍然可以使用ORDER BY在查询级别排序
  • 您想在应用程序(而不是数据库)级别订购?
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 2011-08-09
  • 2013-02-03
相关资源
最近更新 更多