我使用Coherence 12.1.2.0.0
我系统的拓扑结构是:三个带有应用程序的节点(缓存客户端)和具有大量内存的独立缓存服务器。
我的目标是创建缓存系统,该系统不完全依赖缓存服务器,同时在应用程序服务器上消耗严格的内存。所以我想存储缓存服务器上缓存的所有值。但是,如果缓存服务器不起作用,应用程序仍可以使用其小型本地缓存进行操作。
我认为近乎缓存是我需要的。它由作为前端的本地方案和作为后方案的分布式缓存组成。但是当我在客户端的分布式部分中将本地存储设置设置为false时,即使使用前端本地缓存也无法操作,因为我得到“每个put操作都没有存在本地存储的节点”错误。如果我将local-storage设置为true并将本地存储内存限制为例如1个单元缓存服务器不会从客户端接收放置的值。更准确地说,它收到了一些但不是全部。例如,如果我做“放1 1”并得到它几次,然后尝试“放2 2”和“放4 4”我永远不会在缓存服务器上得到“2 2”和“4 4”。在这种情况下,缓存服务器包含“1 1”,可能是值“2 2”或“4 4”中的一个,但不能同时是所有三个对。
我尝试使用直接本地方案的backing-map-scheme和内部部分中使用本地方案的read-write-backing-map-scheme。结果是一样的。这是我的近似测试配置:
<near-scheme>
<scheme-name>near</scheme-name>
<front-scheme>
<local-scheme>
<scheme-ref>local</scheme-ref>
</local-scheme>
</front-scheme>
<back-scheme>
<distributed-scheme>
<scheme-ref>distributed</scheme-ref>
</distributed-scheme>
</back-scheme>
<invalidation-strategy>all</invalidation-strategy>
</near-scheme>
<distributed-scheme>
<scheme-name>distributed</scheme-name>
<service-name>DistributedCache</service-name>
<local-storage>false</local-storage>
<backing-map-scheme>
<local-scheme>
<scheme-ref>local-binary</scheme-ref>
</local-scheme>
</backing-map-scheme>
<autostart>true</autostart>
</distributed-scheme>
<local-scheme>
<scheme-name>local</scheme-name>
<eviction-policy>HYBRID</eviction-policy>
<high-units>1</high-units>
<unit-calculator>FIXED</unit-calculator>
<expiry-delay>{expiry 1h}</expiry-delay>
</local-scheme>
<local-scheme>
<scheme-name>local-binary</scheme-name>
<eviction-policy>HYBRID</eviction-policy>
<high-units>300</high-units>
<unit-calculator>BINARY</unit-calculator>
<expiry-delay>{expiry 1h}</expiry-delay>
</local-scheme>
我需要哪些方案?
答案 0 :(得分:2)
您尝试使用的功能不存在。 Oracle Coherence允许您在应用程序端定义近缓存,但远程缓存服务器必须支持它。没有它,你无法保存任何东西。客户端靠近高速缓存需要服务器端作为大数据库进行交互,以加载和更新从应用程序接收的数据。 你试图设置1单位的技巧也是错误的。每个客户端都试图自己更新值。这里的问题是,当客户端'A'发送更新而'B'发送时,其中一个接收之前(你不知道哪个),另一个被标记为无效。然后,如果你在缓存11中,'A'发送2 2和'B'3 3,其中一个(即3 3)将保留,2 2将被标记为无效,因为1 1在假设方面'C'。 您正在滥用近缓存的功能 - 它没有被指定。 Coherence是一个可靠的缓存,然后如果服务器端不起作用,你的应用程序也不会。 如果您需要有时使用远程服务器更新近端缓存(听起来像这样),请考虑使用其他解决方案。 希望我能帮到你。
答案 1 :(得分:0)
丢失了你的实际问题。但是,如果要为同一群集中的不同节点分配/限制不同的内存大小,则可以将unit-calculator设置为Binary,然后在启动群集节点时通过JVM参数提供自定义最大内存大小。 检查如何计算缓存中对象的大小。