假设有两个服务器正在使用Hazelcast分布式缓存。如果在服务器#1上,我将2项存储在该分布式缓存中的映射中。其中一项将保存在本地备份中,另一项将存储在其他服务器Hazelcast实例的备份中(如果不正确,请更正我)。
我的问题是,如果我试图从缓存中检索第二项(存储在服务器#2上的备份中),就会发出TCP调用来检索该数据。这怎么比调用DB更快呢?
发布于 2016-01-08 06:58:06
首先,让我纠正在Hazelcast上存储数据的方式。
Hazelcast使用基于一致散列的分布算法,这意味着哈希算法始终对相同的输入返回相同的输出。这种分布不是100%相等的分布,而是对高数量的元素相当好和成本效益。也就是说,在最坏的情况下,并不意味着每个节点上都有一个元素。
默认情况下,Hazelcast也会继续备份,这意味着每个节点都有两个元素(在一个2节点的设置中),要么拥有数据,要么作为失败案例的备份。您可以使备份具有可读性(从读到备份=真),但是这会给读取陈旧数据带来很小的机会(所有者之间的时间已经更新,但备份还没有)。
此外,默认情况下,Hazelcast中的数据也是以序列化形式存储的,这意味着二进制流表示。
那么,所有这些怎么能比到数据库的TCP连接更快呢?
答案有两个:
另一方面,您的数据库必须真正从表中查询数据。保存信息的内部数据结构是针对复杂查询进行优化的,而不是针对密钥基础进行访问的。但是,这一点很重要,目前的数据库实现优化了内部(在RAM中),以实现快速访问。因此,这种效果只会发生在高负载下服务的数据库。缓存(本地缓存或分布式缓存)的设计是为了加快缓慢的操作,结果是:如果数据库速度太快,您将看不到任何好处。
无论如何,设计一个期望以指数级增长的系统时,您应该从一开始就考虑缓存。关于缓存和幕后想法的全面介绍可以在缓存白皮书中获得,我不久前写的一篇文章是:https://dzone.com/articles/caching-why-you-should-care
我希望这回答你的问题:-)
https://stackoverflow.com/questions/34664205
复制相似问题