Hazelcast 分布式缓存如何比调用数据库更快?

How is Hazelcast distributed cache faster than a call to the DB?

假设我有 2 台服务器正在使用 Hazelcasts 分布式缓存。如果在服务器 #1 上,我将 2 个项目存储在该分布式缓存的地图中。其中一项将保存在本地备份中,另一项将保存在其他服务器Hazelcast实例的备份中(如果不正确请纠正我)。

我的问题是,如果我尝试从缓存中检索第二项(存储在服务器 #2 的备份中),将进行 TCP 调用以检索该数据。这比调用数据库快多少?

首先让我纠正一下数据在 Hazelcast 上的存储方式。

Hazelcast 使用基于一致性散列的分布算法,这意味着散列算法 returns 始终对相同的输入输出相同的输出。这种分布不是 100% 均等分布,但对于大量元素来说非常好且具有成本效益。也就是说,这并不意味着在最坏的情况下每个节点上都有一个元素。

默认情况下,Hazelcast 也会保持备份,这意味着每个节点都将拥有两个元素(在 2 节点设置中),要么拥有数据,要么作为故障情况的备份。您可以使备份可读 (read-from-backup=true),但是这会带来很小的机会来读取陈旧的数据(所有者之间的时间已更新但备份尚未更新)。

另外,在默认情况下,Hazelcast 中的数据以序列化形式存储,表示二进制流表示。

好的,那么所有这些怎么能比到数据库的 TCP 连接更快呢?

答案是双重的:

  1. Hazelcast 是一家 key-value 商店。因此,它针对通过键请求数据并尽快回复值进行了优化。
  2. 数据已经序列化,因此字节流只是 "smashed" 进入套接字,没有任何真正的进一步工作要做。

另一方面,您的数据库必须真正从 table 查询数据。保存信息的内部数据结构已针对复杂查询进行了优化,但未针对密钥库进行访问。但是,这很重要,当前的数据库实现也在内部(在 RAM 中)进行了优化以实现快速访问。因此,这种效果只会发生在高负载下服务的数据库上。缓存(本地或分布式)旨在加速缓慢的操作,结果是:如果您的数据库非常快,您将看不到任何好处。

无论如何,设计一个您希望以指数方式增长的系统时,您应该从一开始就考虑缓存。缓存的全面介绍和背后的想法可以在我前段时间写的缓存白皮书和文章中找到:https://dzone.com/articles/caching-why-you-should-care

我希望这能回答您的问题:-)