package com.diagnose.common.config.cache; import com.hazelcast.config.InMemoryFormat; import java.util.HashMap; import java.util.Map; import static com.diagnose.common.config.cache.CacheKey.*; public class CacheConfig { public static final String DEFAULT_MAP_NAME = "default"; public static class LocalMapConfig { public final int maxSize; public final int liveSeconds; public final InMemoryFormat inMemoryFormat; LocalMapConfig(int maxSize, int liveSeconds) { this.maxSize = maxSize; this.liveSeconds = liveSeconds; this.inMemoryFormat = InMemoryFormat.BINARY; } LocalMapConfig(int maxSize, int liveSeconds, InMemoryFormat inMemoryFormat) { this.maxSize = maxSize; this.liveSeconds = liveSeconds; this.inMemoryFormat = inMemoryFormat; } } public static Map getConfigMap() { // 设置近地缓存实时同步,不采用批量提交策略 System.setProperty("hazelcast.map.invalidation.batch.enabled", "false"); // PER_NODE:max-size指定单个集群成员中map条目的最大数量。这是max-size的默认策略。如果使用这个配置,需要注意max-size的值必须大于分区的数量(默认为271)。 // PER_PARTITION:max-size指定每个分区存储的map条目最大数。这个策略建议不要在小规模的集群中使用,因为小规模的集群,单个节点包含了大量的分区,在执行回收策略时,会去按照分区的划分组个检查回收条件,导致效率低下。 // USED_HEAP_SIZE:指在每个Hazelcast实例中,max-size指定map所占用的内存堆的(以megabytes计算,兆字节)最大值。需要注意这个策略不能工作在in-memory-format=OBJECT,因为当数据被设置为OBJECT时,无法确定所占用的内存大小。 // USED_HEAP_PERCENTAGE:每个Hazelcast实例中,max-size指定map占用内存堆的百分比。例如,JVM被设置有1000MB,而这个值设置为max-size=10,当map条目数占用的堆数据超过100MB时,Hazelcast开始执行数据释放工作。需要注意的是当使用这个策略时,不能将in-memory-format设置为OBJECT,理由同上。 // FREE_HEAP_SIZE:max-size指定了单个JVM的堆最小空闲空间,单位为megabytes。 // FREE_HEAP_PERCENTAGE:max-size指定单个JVM的最小空闲空间的百分比。例如JVM分配了1000MB的空间,这个值设置为10,当空闲堆只有100MB时,会引发map的数据清除放行为。 // 当map条数超过10000,会引发map的数据清除行为 Map configMap = new HashMap<>(); configMap.put(DISTRIBUTED_LOCK, new LocalMapConfig(1000, 0)); return configMap; } }