Hazelcast分布式缓存如何比调用DB更快



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

我的问题是,如果我试图从缓存(存储在服务器#2的备份中)中检索第二个项目,则会调用TCP来检索该数据。这怎么比只调用DB更快呢?

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

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

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

此外,默认情况下,Hazelcast中的数据以串行形式存储,这意味着二进制可流式表示。

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

答案是双重的:

  1. Hazelcast是一个重要的价值存储。因此,它被优化为通过键请求数据并尽快用值进行应答
  2. 数据已经被序列化,因此字节流只是被"粉碎"到套接字中,而没有任何真正的进一步工作要做

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

无论如何,在设计一个期望呈指数级增长的系统时,您应该从一开始就考虑缓存。缓存白皮书和我不久前写的一篇文章对缓存及其背后的想法进行了全面的介绍:https://dzone.com/articles/caching-why-you-should-care

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

最新更新