如何在没有数据一致性要求的情况下设置DB和ORM?

时间:2013-03-05 15:05:44

标签: sql hibernate caching web proxy

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

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

我怎样才能实现它?

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

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

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

  3. 可能我可以在DB中设置一些内容。我不知道我应该怎么做DB。可能我可以放松隔离级别来破坏我的数据库的性能。

  4. 那么,哪种方式最好?

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

2 个答案:

答案 0 :(得分:1)

如果我正在阅读您的架构,那么您有客户 - >服务器 - >数据库服务器

每个点的答案

  1. 如果您只使用自己的客户端,这会给客户端带来实施缓存的负担。它可能会产生改善客户端性能的副作用,并减少服务器和数据库服务器的负载,以便它们更好地扩展。

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

  3. 在数据库中实现某些功能。在这一点上你获得了什么?数据库服务器仍然必须工作以确定要发回的行。此外,您将无法获得可扩展性优势。

  4. 总而言之,如果你能在服务器上缓存,我会先在客户端缓存。让DB退出循环。

答案 1 :(得分:0)

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

一般情况下,我建议您设置负载测试平台,并在开始优化之前测量应用的各个部分以确定瓶颈。

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

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

接下来,您可以在ORM级别缓存。 Hibernate有一个漂亮的robust implementation,它在缓存策略中提供了很多粒度。 This article显示了一个示例实现,包括如何控制到期时间。您可以在此处获得对缓存的大量控制 - 您可以在表级别指定行为,因此可以将“查找”数据缓存数天,将“事务”数据缓存数秒。

数据库已经在“引擎盖下”实现了一个缓存 - 例如,它会将经常使用的数据加载到内存中。在某些应用程序中,您可以通过“对复杂数据进行反规范化”来进一步提高数据库性能 - 因此导入例程可能会将复杂的数据结构转换为简单的数据结构。这确实了数据一致性和可维护性与性能的交易。