java - 进程内缓存 vs 分布式缓存与可变/不可变对象(immutable对象)的一致性

标签 java caching architecture memcached distributed-caching

我听我的同事说,在缓存 immutable 对象时,进程内缓存是更好的选择,因为一致性不是大问题(最终一致性)。而外部分布式缓存更适合您始终希望读取保持一致(强)的可变对象。

这总是事实吗?我真的不明白可变性与一致性有何关系。有人可以帮助我理解这一点吗?

最佳答案

当您使用分布式缓存时,每个对象都在多个独立机器、多个缓存节点之间复制。

如果您的对象是不可变的,复制就不是问题:因为对象永远不会改变,所以任何缓存实例都将提供完全相同的对象。

一旦对象变得可变,就会出现一致性问题:当您向缓存实例请求对象时,您如何确定交付给您的对象是最新的?如果在一个缓存实例为您服务时,该对象正在被另一个用户在另一个缓存实例上修改怎么办?在这种情况下,您不会收到最新版本,您会收到一个过时的版本

要处理这个问题,必须做出选择。一种选择是接受某种程度的陈旧性,这样可以获得更好的性能。另一种选择是使用某种同步协议(protocol),这样您就永远不会收到陈旧的数据:但显然,远距离缓存节点之间的这种数据同步会导致性能损失。

相反,假设您将某个对象的一些修改上传到缓存节点。如果同时另一个用户将同一对象的一些修改上传到另一个缓存节点怎么办?这应该被允许,还是应该被某种锁定机制禁止?

此外,缓存节点上的对象修改是否应该立即对该缓存节点的用户可见?还是只有在复制到其他节点后它们才可见?

归根结底,在多个用户之间共享分布式缓存时,可变对象确实会使事情变得更加复杂。尽管如此,这并不意味着不应该使用这些缓存:它只是意味着需要更多的时间和更多的谨慎来研究所有可用的选项并为每个应用程序选择合适的缓存。

关于java - 进程内缓存 vs 分布式缓存与可变/不可变对象(immutable对象)的一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33332288/

相关文章:

java - 删除包装器异常的堆栈跟踪 : bad idea?

java - 如何重写 boolean 值handleUnattended()

java - 如何使用 JMF 播放 .avi 文件

java - 使用javamail发送邮件时出现问题

architecture - n 层软件设计是 SOA 的子集吗?

c++ - DLL缓存问题

文件缓存选项

jquery - 使用 jQuery 缓存,缓存 jQuery Sortable 对象

performance - 你会为了性能而违背 REST 的幂等性原则吗?

java - 使用线程池和 BlockingQueue 重新架构 I/O 密集型 Java Web 服务