@Override
public IStruct getStoreMetadataReport( int limit ) {
IStruct report = new Struct();
try {
Stream<Map.Entry<String, ICacheEntry>> entryStream =
this.caffeineCache.asMap().entrySet().stream();
if ( limit > 0 ) {
entryStream = entryStream.limit( limit );
}
entryStream.forEach( entry => {
try {
String key = entry.getKey();
ICacheEntry cacheEntry = entry.getValue();
if ( cacheEntry != null ) {
report.put( key, cacheEntry.toStruct() );
} else {
report.put( key, new Struct() );
}
} catch ( Exception e ) {
logger.debug( "Error getting metadata for key [{}]", entry.getKey(), e );
report.put( entry.getKey(), new Struct() );
}
} );
} catch ( Exception e ) {
logger.error( "Error generating store metadata report", e );
}
return report;
}
@Override
public IStruct getStoreMetadataReport() {
return getStoreMetadataReport( 0 ); // No limit
}
@Override
public IStruct getStoreMetadataKeyMap() {
return Struct.of(
"cacheName", "cacheName",
"hits", "hits",
"timeout", "timeout",
"lastAccessTimeout", "lastAccessTimeout",
"created", "created",
"lastAccessed", "lastAccessed",
"metadata", "metadata",
"key", "key",
"isEternal", "isEternal"
);
}
@Override
public IStruct getCachedObjectMetadata( String key ) {
try {
ICacheEntry entry = this.caffeineCache.getIfPresent( key );
if ( entry != null ) {
return entry.toStruct();
}
} catch ( Exception e ) {
logger.error( "Error getting metadata for key [{}]", key, e );
}
return new Struct();
}
/**
* Get Caffeine's native statistics if recording is enabled
*/
public IStruct getCaffeineStats() {
try {
com.github.benmanes.caffeine.cache.stats.CacheStats caffeineStats =
this.caffeineCache.stats();
return Struct.of(
"requestCount", caffeineStats.requestCount(),
"hitCount", caffeineStats.hitCount(),
"hitRate", caffeineStats.hitRate(),
"missCount", caffeineStats.missCount(),
"missRate", caffeineStats.missRate(),
"loadCount", caffeineStats.loadCount(),
"loadExceptionCount", caffeineStats.loadExceptionCount(),
"totalLoadTime", caffeineStats.totalLoadTime(),
"averageLoadPenalty", caffeineStats.averageLoadPenalty(),
"evictionCount", caffeineStats.evictionCount()
);
} catch ( Exception e ) {
logger.debug( "Caffeine stats not available (recording may not be enabled)", e );
return new Struct();
}
}
// Additional utility methods for the Caffeine provider
@Override
public void set( String key, Object value ) {
set( key, value, this.defaultTimeout, this.defaultLastAccessTimeout );
}
@Override
public void set( String key, Object value, Object timeout ) {
set( key, value, timeout, this.defaultLastAccessTimeout );
}
@Override
public void set( String key, Object value, Object timeout, Object lastAccessTimeout ) {
set( key, value, timeout, lastAccessTimeout, new Struct() );
}
@Override
public void set( IStruct entries ) {
entries.forEach( ( key, value ) => {
set( key.getName(), value, this.defaultTimeout, this.defaultLastAccessTimeout );
} );
}
@Override
public void set( IStruct entries, Object timeout, Object lastAccessTimeout ) {
entries.forEach( ( key, value ) => {
set( key.getName(), value, timeout, lastAccessTimeout );
} );
}
@Override
public void setQuiet( Key key, ICacheEntry value ) {
this.caffeineCache.put( key.getName(), value );
}
@Override
public Object getOrSet( String key, Supplier<Object> provider ) {
return getOrSet( key, provider, this.defaultTimeout, this.defaultLastAccessTimeout );
}
@Override
public Object getOrSet( String key, Supplier<Object> provider, Object timeout ) {
return getOrSet( key, provider, timeout, this.defaultLastAccessTimeout );
}
@Override
public Object getOrSet( String key, Supplier<Object> provider, Object timeout, Object lastAccessTimeout ) {
return getOrSet( key, provider, timeout, lastAccessTimeout, new Struct() );
}
}