我听到我的同事说在缓存不可变对象时,进程内缓存是更好的选择,其中一致性不是一个大问题(最终是一致性)。而外部分布式缓存更适合可变对象,而您始终希望读取一致(强)。
这总是真的吗?我真的没有看到可变性与一致性有什么关系。有人能帮助我理解这个吗?
答案 0 :(得分:4)
使用分布式缓存时,每个对象都在多个独立的计算机,多个缓存节点之间进行复制。
如果您的对象是不可变的,则复制不是问题:由于对象永远不会更改,因此任何缓存实例都将提供完全相同的对象。
一旦对象变得可变,就会出现一致性问题:当您向缓存实例请求对象时,如何确定传递给您的对象是最新的?如果在为一个缓存实例提供服务时,另一个用户在另一个缓存实例上修改了该对象,该怎么办?在这种情况下,您将不会收到最新版本,您将收到陈旧版本。
要解决这个问题,必须做出选择。一种选择是接受某种程度的陈旧性,这样可以获得更好的性能。另一种选择是使用一些同步协议,这样你就永远不会收到过时的数据:但是远程缓存节点之间的数据同步显然会有性能损失。
相反,假设您上传到缓存节点对对象进行了一些修改。如果同时另一个用户将同一对象的某些修改上传到另一个缓存节点会怎么样?这是允许的,还是应该被某些锁定机制禁止?
此外,缓存节点上的对象修改是否应立即对此缓存节点的用户可见?或者它们是否应该在被复制到其他节点后才可见?
在一天结束时,可变对象在多个用户之间共享分布式缓存时会使事情变得更复杂。尽管如此,这并不意味着不应该使用这些缓存:它只是意味着研究所有可用选项并为每个应用程序选择适当的缓存需要更多的时间和更多的谨慎。
答案 1 :(得分:4)
尽管丹尼尔给出了一个很好的解释,但由于某种原因,我并不是100%清楚。所以,我用Google搜索了,this文章为我清除了雾。
摘自文章:
使用进程内缓存时,缓存元素对于应用程序的单个实例是本地的。但是,许多中型到大型应用程序不会有单个应用程序实例,因为它们很可能是负载平衡的。在这样的设置中,您将获得与应用程序实例一样多的缓存,每个缓存都具有不同的状态,从而导致不一致。
分布式缓存虽然部署在多个节点的集群上,但提供缓存的单个逻辑视图(和状态)。在大多数情况下,存储在分布式缓存集群中的对象将驻留在分布式缓存集群中的单个节点上。通过散列算法,缓存引擎可以始终确定特定键值驻留在哪个节点上。由于缓存集群始终存在单个状态,因此永远不会发生不一致。
如果您正在缓存不可变对象,则一致性不再是问题。在这种情况下,进程内缓存是更好的选择,因为通常与外部分布式缓存相关联的许多开销根本不存在。如果您的应用程序部署在多个节点上,那么您可以缓存可变对象,并且希望读取始终保持一致而不是最终一致,分布式缓存是可行的方法。