Hazelcast客户端近缓存配置疑问:Map-ID与近缓存ID是否必须完全一致?
我太懂你这种困惑了!明明看文档说近缓存配置支持通配符匹配Map名称,但实际测下来只有完全一模一样的名称才能生效,换个差几个字符的就不行,肯定挠头得很对吧?
先给你点破核心问题:你之前的测试根本没用到文档里说的「通配符」!文档里提到的mostlyRead*匹配mostlyReadMap,关键是那个*号——没有显式加通配符的话,Hazelcast的近缓存配置只会做精确完全匹配,这就是你之前只有counter配counter才生效的原因。
先理清楚正确的匹配规则
Hazelcast客户端近缓存的名称匹配是遵循glob风格的通配符规则:
*匹配任意长度的任意字符(包括空字符)?匹配单个任意字符- 没有通配符的话,就要求配置名称和Map ID完全一致才能匹配
你之前试的那些组合,比如NearCacheConfig("counter")配getMap("counterId"),本质是两个完全不同的固定字符串,没有通配符的话自然匹配不上,和文档里说的通配符功能完全不沾边。
正确的通配符测试示例
如果想让同一个近缓存配置匹配counter和counterId,你得在配置名称里加通配符,比如:
// 配置前缀通配符,匹配所有以counter开头的Map NearCacheConfig wildcardConfig = new NearCacheConfig("counter*") .setInMemoryFormat(InMemoryFormat.BINARY) .setTimeToLiveSeconds(30) .setMaxIdleSeconds(10) .setEvictionConfig(new EvictionConfig() .setEvictionPolicy(EvictionPolicy.LRU) .setSize(1000)); // 把这个配置加到客户端Config里 ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(wildcardConfig);
这时候不管你调用hazelcastClient.getMap("counter")还是hazelcastClient.getMap("counterId"),都会自动应用这个近缓存配置。
如果你想匹配包含counter的所有Map(比如mycounter、counter123),可以用*counter*作为配置名称;如果想匹配单个字符的差异(比如counter1、counter2),可以用counter?。
再回头看你之前的错误测试
你之前试的这两组:
new NearCacheConfig("counter")+hazelcastClient.getMap("counterId"):配置是精确匹配counter,但Map是counterId,没有通配符的话完全不搭边new NearCacheConfig("counterId")+hazelcastClient.getMap("counter"):反过来也是一样,配置精确匹配counterId,Map是counter,自然也匹配不上
这两种情况里,客户端找不到和Map ID匹配的近缓存配置,自然就不会启用近缓存,所以你看到的日志都是直接从集群读数据的结果。
额外补充:匹配优先级
如果客户端配置了多个近缓存规则,Hazelcast的匹配顺序是:
- 先找精确完全匹配的配置
- 再找通配符匹配的配置(按配置的先后顺序,找到第一个匹配的就用)
- 都找不到的话,就不启用近缓存
所以如果你同时配置了new NearCacheConfig("counter")和new NearCacheConfig("counter*"),那么hazelcastClient.getMap("counter")会优先用精确匹配的那个配置,而hazelcastClient.getMap("counterId")会用通配符的配置。
备注:内容来源于stack exchange,提问作者zappee

