Hazelcast:是否需要查询缓存索引?
Hazelcast: is Index on query Cache required?
短代码示例:
HazelcastInstance client = HazelcastClient.newHazelcastClient(clientConfig);
IMap<Integer, Integer> clientMap = client.getMap(mapName);
clientMap.addIndex("user.id", false);
QueryCache<Integer, Integer> cache = clientMap.getQueryCache(cacheName);
cache.addIndex("user.id", false);
索引应该添加到缓存和 IMap 还是只添加到两者之一?
QueryCache
或支持 IMap
不需要索引,但根据您的用例,索引可能有助于提高解决方案的性能。例如:
如果查询缓存的 Predicate
可以利用索引,地图上的索引可能会缩短初始填充 QueryCache
所花费的时间。您可以查看 this trivial benchmark 来比较初始化 QueryCache
所花费的时间(在我的本地地图被索引时,初始查询缓存填充速度快几个数量级,但显然是 YMMV)。
如果您的用例涉及过滤查询缓存(例如通过 QueryCache.values(Predicate)
),那么 QueryCache
上的索引将有助于加快您的查询速度。尽管如此,考虑到这是以 QueryCache
中更昂贵的写入为代价的,因为索引维护的开销。
短代码示例:
HazelcastInstance client = HazelcastClient.newHazelcastClient(clientConfig);
IMap<Integer, Integer> clientMap = client.getMap(mapName);
clientMap.addIndex("user.id", false);
QueryCache<Integer, Integer> cache = clientMap.getQueryCache(cacheName);
cache.addIndex("user.id", false);
索引应该添加到缓存和 IMap 还是只添加到两者之一?
QueryCache
或支持 IMap
不需要索引,但根据您的用例,索引可能有助于提高解决方案的性能。例如:
如果查询缓存的
Predicate
可以利用索引,地图上的索引可能会缩短初始填充QueryCache
所花费的时间。您可以查看 this trivial benchmark 来比较初始化QueryCache
所花费的时间(在我的本地地图被索引时,初始查询缓存填充速度快几个数量级,但显然是 YMMV)。如果您的用例涉及过滤查询缓存(例如通过
QueryCache.values(Predicate)
),那么QueryCache
上的索引将有助于加快您的查询速度。尽管如此,考虑到这是以QueryCache
中更昂贵的写入为代价的,因为索引维护的开销。