Spring Boot中如何记录Hazelcast Near Cache的命中/未命中日志?
Hazelcast Near Cache 命中/未命中日志记录方案
Hazelcast原生提供了Near Cache的统计能力,但没有直接内置命中/未命中的日志输出,你可以基于它的API快速实现日志记录,不需要完全手动开发缓存逻辑。
1. 先开启Near Cache统计功能
不管用哪种配置方式(XML/YAML/Java代码),都需要给目标Near Cache开启统计:
- YAML配置(
hazelcast.yaml):
hazelcast: maps: your-map-name: near-cache: enabled: true stats-enabled: true
- Java配置类:
@Bean public Config hazelcastConfig() { Config config = new Config(); NearCacheConfig nearCacheConfig = new NearCacheConfig("your-map-name") .setEnabled(true) .setStatsEnabled(true); config.getMapConfig("your-map-name").setNearCacheConfig(nearCacheConfig); return config; }
2. 实现日志记录的两种方式
方式一:定时输出统计汇总日志
适合需要定期查看缓存整体命中率的场景,用Spring定时任务配合Near Cache统计API实现:
import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.IMap; import com.hazelcast.map.NearCacheStats; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class NearCacheStatsLogger { private static final Logger log = LoggerFactory.getLogger(NearCacheStatsLogger.class); private final HazelcastInstance hazelcastInstance; public NearCacheStatsLogger(HazelcastInstance hazelcastInstance) { this.hazelcastInstance = hazelcastInstance; } @Scheduled(fixedRate = 60000) // 每分钟打印一次 public void logNearCacheMetrics() { IMap<?, ?> map = hazelcastInstance.getMap("your-map-name"); NearCacheStats stats = map.getNearCacheStats(); log.info("Near Cache [your-map-name] Stats - Total Hits: {}, Total Misses: {}, Hit Ratio: {:.2f}", stats.getHits(), stats.getMisses(), stats.getHitRatio()); } }
方式二:实时记录单条命中/未命中日志
如果需要记录每次缓存命中或未命中的具体key,可以自定义NearCacheEntryListener:
import com.hazelcast.map.NearCacheEntryEvent; import com.hazelcast.map.NearCacheEntryListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NearCacheHitMissListener implements NearCacheEntryListener<Object, Object> { private static final Logger log = LoggerFactory.getLogger(NearCacheHitMissListener.class); @Override public void onHit(NearCacheEntryEvent<Object, Object> event) { log.debug("Near Cache hit for map [{}], key: {}", event.getSourceName(), event.getKey()); } @Override public void onMiss(NearCacheEntryEvent<Object, Object> event) { log.debug("Near Cache miss for map [{}], key: {}", event.getSourceName(), event.getKey()); } // 实现其他空方法(不需要可留空) @Override public void entryAdded(NearCacheEntryEvent<Object, Object> event) {} @Override public void entryRemoved(NearCacheEntryEvent<Object, Object> event) {} @Override public void entryUpdated(NearCacheEntryEvent<Object, Object> event) {} @Override public void entryEvicted(NearCacheEntryEvent<Object, Object> event) {} @Override public void entryExpired(NearCacheEntryEvent<Object, Object> event) {} }
然后在Near Cache配置中注册这个监听器:
NearCacheConfig nearCacheConfig = new NearCacheConfig("your-map-name") .setEnabled(true) .setStatsEnabled(true) .addNearCacheEntryListenerConfig( new NearCacheEntryListenerConfig(new NearCacheHitMissListener()) );
内容的提问来源于stack exchange,提问作者Swapnil Singh
相关产品推荐
相关产品推荐

