现代数据库提供缓存支持。大多数ORM框架也会缓存检索到的数据。为什么需要这种重复的操作呢?
现代数据库提供缓存支持。大多数ORM框架也会缓存检索到的数据。为什么需要这种重复的操作呢?
因为要从数据库的缓存中获取数据,您仍然需要执行以下操作:
通过在应用程序级别进行缓存,您不需要执行上述任何操作。通常,这只是在内存哈希表中进行简单查找。有时(如果使用memcache进行缓存),仍然存在网络往返,但此时不再发生所有其他操作。
以下是您可能需要这样做的原因:
然而,这对于主节点并不起作用,因为它只能进行垂直扩展:
这就是缓存发挥作用的地方。对于需要在主节点上执行的读写数据库事务,缓存可以帮助您将查询负载减少,并将其定向到一个强一致性缓存,例如Hibernate二级缓存:
将应用程序级别的缓存存储在应用程序的内存中存在几个问题。
首先,应用程序内存有限,因此可以缓存的数据量也有限。
其次,当流量增加并且我们想要启动新的应用程序节点来处理额外的流量时,新节点将以冷缓存启动,使问题变得更糟,因为它们会导致数据库负载激增,直到缓存填充了数据为止:
为了解决这个问题,最好将缓存运行作为一个分布式系统,如Redis。这样,缓存的数据量不会受限于单个节点的内存大小,因为可以使用分片将数据分散在多个节点之间。当自动扩展程序添加新的应用节点时,新节点将从同一分布式缓存中加载数据。因此,不再存在冷缓存问题。
有关网络往返的性能考虑已经被正确指出。
除了在数据库管理系统(而不是“数据库”)中缓存数据之外,将数据缓存到其他任何地方都会产生潜在过时数据的问题,这些数据仍然被呈现为“最新的”。
为了追求性能提升而放弃绝对可靠和一致的数据保证(严密或至少接近于此),这是有代价的。
每当准确性和一致性至关重要时,请考虑这一点。
毫无疑问,现代数据库提供了缓存功能,但当您的网站流量增加并且需要执行许多数据库事务时,您将无法获得高性能。因此,在这种情况下,Hibernate缓存将帮助您通过优化数据库应用程序来提高性能。缓存实际上存储已从数据库加载的数据,以便在应用程序再次访问该数据时,我们的应用程序和数据库之间的流量将减少。应用程序和数据库之间的访问时间和流量将减少。