我有一个配置,其中缓存保存在一个节点中并从另一个节点访问。虽然我能够得到()和put()完全没问题,但像size(),keySet()等一些操作并没有给我正确的结果。
Test1客户端节点缓存配置
<bean id="test-cache" class="org.gridgain.grid.cache.GridCacheConfiguration">
<property name="name" value="testCache"/>
<property name="cacheMode" value="PARTITIONED"/>
<property name="distributionMode" value="CLIENT_ONLY" />
<property name="swapEnabled" value="true"/>
</bean>
Test1客户端节点类
public class GridGainTest1
{
public static void main(String[] args) throws Exception
{
//Client Mode
Grid g = GridGain.start("etc/config/grid-test1.xml");
//Put in Remote Cache
g.cache("testCache").put(1, "ABC");
g.cache("testCache").put(2, "XYZ");
System.out.println("Size of Cache :- " + g.cache("testCache").size());
System.out.println("Value for 1 :- " + g.cache("testCache").get(1));
System.out.println("Value for 2 :- " + g.cache("testCache").get(2));
}
Test2数据节点缓存配置
<bean id="test-cache" class="org.gridgain.grid.cache.GridCacheConfiguration">
<property name="name" value="testCache"/>
<property name="cacheMode" value="PARTITIONED"/>
<property name="swapEnabled" value="true"/>
</bean>
Test2数据节点类
public class GridGainTest2
{
public static void main(String[] args) throws Exception
{
Grid g = GridGain.start("etc/config/grid-test2.xml");
}
}
节点1的输出如下,即使地图中有条目,大小也会显示为0。我不确定这是否是由于一些配置错误造成的。
Size of Cache :- 0
Value for 1 :- ABC
Value for 2 :- XYZ
答案 0 :(得分:1)
在GridGain缓存API方法size()
,primarySize()
,nearSize()
,keySet()
,primaryKeySet()
,values()
,primaryValues()
中, entrySet()
,primaryEntrySet()
是本地的,它们只返回存储在本地节点上的密钥的大小或集合。
在您的情况下,您在CLIENT_ONLY
模式下在Test1上启动了缓存,因此该节点不存储任何密钥。这就是您始终将0
视为缓存大小的原因。
如果需要全局缓存大小,可以使用以下代码:
GridCallable<Integer> sizeCallable = new GridCallable<Integer>() {
@Override public Integer call() throws Exception {
return g.cache("testCache").size();
}
};
Collection<Integer> sizes = g.forCache("testCache").compute()
.broadcast(sizeCallable).get();
int globalSize = 0;
for (Integer s : sizes)
globalSize += s;
方便的GridCache.globalSize()
方法将在即将发布的GridGain 6.2版本中添加。