2

想象一下,我们有一个网站,它通过 Hibernate 将写入和读取请求发送到某个数据库。我使用Java,但这个问题并不重要。

通常我们想从数据库中读取新数据。但是我想在写入的数据变得对读取可见之间引入一些延迟,以提高性能。即我不需要立即“发布”插入数据库的行。延迟一段时间后,我可以“发布”新数据。

我怎样才能实现它?

据我了解,这可以在我系统的几个不同层上进行设置。

  1. 我可以在前端缓存一些请求。可能我应该为此设置代理服务器。但这只有在查询的所有参数都匹配时才有效。

  2. 我可以在 Hibernate 中缓存读取请求。好的,但是我可以指定或估计读取查询在发生一些新插入后返回陈旧数据的平均时间吗?换句话说,我如何控制用户可以看到新数据之间的延迟时间?或者可能我应该使用类似 memcached 系统而不是 Hibernate 缓存?

  3. 可能我可以在数据库中设置一些东西。我不知道我应该如何处理 DB。可能我可以降低隔离级别以提高数据库的性能。

那么,哪种方式最好呢?

当然,主要问题是:我在这里介绍的放宽要求真的有助于提高我的系统性能吗?

4

2 回答 2

1

如果我正确阅读了您的体系结构,那么您有客户端-> 服务器-> 数据库服务器

每个点的答案

  1. 如果您只使用自己的客户端,这将给客户端带来实现缓存的负担,我会采用这种方法。它将具有可能提高客户端性能的副作用,并减少服务器和数据库服务器的负载,因此它们可以更好地扩展。

  2. 现在,服务器上的缓存将提高数据库服务器的可伸缩性,并可能提高客户端的性能,但会给服务器带来内存负担。这将是我的第二个选择

  3. 在数据库中实现一些东西。在这一点上,你得到了什么?数据库服务器仍然需要确定要发回的行。而且您也不会获得可扩展性优势。

所以总结一下,如果你不能缓存在服务器上,我会先在客户端缓存。将数据库排除在循环之外。

于 2013-03-05T15:13:16.783 回答
0

要回答您的主要问题 - 缓存是提高受数据库性能限制的 Web 应用程序的性能和可伸缩性的最有效方法之一 - 您的应用程序可能属于也可能不属于这一类。

一般来说,我建议设置一个负载测试平台,并在开始优化之前测量应用程序的各个部分以识别瓶颈。

最有效的缓存是系统外部的缓存——CDN 或用户浏览器。阅读浏览器缓存,看看是否有任何东西可以在本地缓存。浏览器具有内置缓存作为标准功能 - 您可以通过 HTTP 标头控制它们。这些缓存非常有效,因为它们甚至可以阻止请求到达您的基础架构;它们对于图像、javascript 文件或样式表等静态 Web 资产非常有效。我认为代理服务器属于同一类别。主要的缺点是很难管理这个缓存——一旦你对浏览器说“缓存这个 2 周”,刷新它就很难了。

下一个最有效的缓存层是在应用服务器上缓存(部分)网页。如果可以做到这一点,就可以避免呈现页面的成本和从数据库中检索数据的成本。不同的 Web 框架对此有不同的解决方案。

接下来,您可以在 ORM 级别进行缓存。Hibernate 有一个非常健壮的实现,它在你的缓存策略中提供了很多粒度。本文展示了一个示例实现,包括如何控制过期时间。您可以在此处对缓存进行大量控制 - 您可以在表级别指定行为,因此您可以将“查找”数据缓存数天,将“事务”数据缓存数秒。

The database already implements a cache "under the hood" - it will load frequently used data into memory, for instance. In some applications, you can further improve the database performance by "de-normalizing" complex data - so the import routine might turn a complex data structure into a simple one. This does trade of data consistency and maintainability against performance.

于 2013-03-05T15:41:03.667 回答