我有下一个环境:
我尝试了以下步骤来测试缓存复制:
[传入2,liferay频道控制,WS-5459-64327] [JGroupsReceiver:91] 接受的视图MergeView :: [WS-5459-18884 | 3](2)[WS-5459-18884, WS-5459-64327],两个子组:[WS-5459-64327 | 1](2)[WS-5459-64327, WS-5459-18884],[WS-5459-18884 | 2](1)[WS-5459-18884]
MultiVMPoolUtil.getPortalCache(“ com.liferay.portal.kernel.webserver.WebServerServletToken”)。put(“ 1”,“ 1”)
MultiVMPoolUtil.getPortalCache(“ com.liferay.portal.kernel.webserver.WebServerServletToken”)。getKeys()
但是在第二个节点上的此缓存中没有键“ 1”,但是如果我尝试使用相同的API .remove(“ 1”)进行删除,则在第一个节点上将删除该值。>
问题是如何为放置操作配置缓存复制?
答案 0 :(得分:0)
ClusterLink不能像这样工作,而是“使”缓存无效,而不是“复制”它们:
如果您在节点1上修改对象“ 1”,则节点2将收到有关“ 1”已更改的通知,并且-如果该对象已被缓存-则将其从其自身的缓存中删除。仅在随后需要“ 1”的情况下,才会检测到缓存丢失并从数据库(或其他持久性存储)中检索对象。
如果node2上没有人要该对象,则node2上不会检索任何内容。
此外,如果node1上的缓存溢出(缓存不是无限的,实际上,它的大小可能配置为0),您甚至无法假设您将能够永远从node1的缓存中检索此对象。
因此,您的观察是正确的:在一个节点中进行更改或删除会将具有给定键的对象从所有缓存中删除。这就是它的实现方式,它非常有用:无需缓存您可能永远无法在给定计算机上访问的内容。
我相信很久以前就听说过实际的缓存复制,例如可能是可配置的。但是我从未尝试过,因为它不是必需的,并且无效也不会带来很大的负担。