4

刚刚实现了一个设计,我在 hashmap 中缓存了一些数据并从中检索数据,而不是从 DB 中查询相同的数据。

我的想法正确吗?

4

7 回答 7

7

将数据副本保存在内存中几乎肯定会比从数据库中获取数据要快。

也就是说,还需要进一步考虑:

  1. 当您持有内存副本时,数据库中的数据可以更改吗?如果是这样,您将如何处理?
  2. 内存消耗会成为问题吗?
  3. 你确定你正在优化一个真实的而不是想象的瓶颈吗?
于 2012-12-20T13:37:54.863 回答
4

点击一个集合将比点击一个数据库快几个数量级,尤其是在另一台服务器上(由于通信滞后)

那说:

  • 数据库可以自己缓存数据,因此这种优化可能不是必需的
  • 如果数据非常大,您将不得不处理内存消耗
  • 必须处理对数据的更新,例如使缓存无效
于 2012-12-20T13:38:14.110 回答
3

如果您仔细考虑与数据库交谈时会发生什么,您可以自己回答这个问题:

  1. 您的程序必须将查询发送到数据库。根据数据库服务器是在进程内运行还是在网络上的其他位置运行,这可能需要几微秒到几毫秒不等。
  2. 数据库服务器必须解析您的查询并生成执行计划。根据服务器的不同,它可能会为频繁执行的查询缓存一个执行计划。如果没有,请再计划几微秒以生成计划。
  3. 数据库服务器必须执行您的计划,读取访问数据所需的任何磁盘块。每次磁盘访问将花费数十毫秒。根据表的大小以及索引的好坏,您的查询可能需要几秒钟的时间。
  4. 数据库服务器必须打包数据并将其发送回应用程序。同样,取决于它是在进程中还是通过网络,这将需要几微秒到几毫秒,并且会根据发回的数据量而有所不同。
  5. 您的应用程序必须将检索到的数据转换为有用的形式。这可能是一微秒或更短。

相比之下,查找散列数据结构需要几次内存访问,每次可能需要几纳秒。相差几个数量级

于 2012-12-20T15:43:44.230 回答
2

要考虑的主要问题是缓存的大小:在某个阈值之后,您造成的损害多于好处。例如,如果缓存有一百万个条目,并且每个条目是 1 KB(考虑到每个对象的开销,访问并不难),那么您已经占用了整整 GB 的堆。在这种情况下,major GC 的性能也会很糟糕。

于 2012-12-20T13:42:57.453 回答
0

总是比你在代码级别做的任何事情都更昂贵。

于 2012-12-20T13:39:03.037 回答
0

这样看:要查询数据库,无论如何都必须将字节复制到内存中。因此,仅仅访问内存总是比访问数据库要快。

于 2012-12-20T13:39:06.050 回答
0

如果计算哈希码的成本很低,应该会快得多,它还取决于条目的数量(因为会有更多的冲突)

于 2012-12-20T13:39:09.210 回答