Add an autoconfigured Spring Boot CacheStatisticsProvider implementation

pull/790/head
Craig Andrews 8 years ago
parent ac89ade75c
commit d4603413bf
No known key found for this signature in database
GPG Key ID: 4589B16C461AB092

@ -244,6 +244,12 @@
<version>1.2.2.RELEASE</version> <version>1.2.2.RELEASE</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
<version>[1.4,)</version>
<scope>provided</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>

@ -18,6 +18,7 @@ package org.redisson.spring.cache;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import org.redisson.api.RLock; import org.redisson.api.RLock;
import org.redisson.api.RMap; import org.redisson.api.RMap;
@ -41,6 +42,10 @@ public class RedissonCache implements Cache {
private final RedissonClient redisson; private final RedissonClient redisson;
private final AtomicLong hits = new AtomicLong();
private final AtomicLong misses = new AtomicLong();
public RedissonCache(RedissonClient redisson, RMapCache<Object, Object> mapCache, CacheConfig config) { public RedissonCache(RedissonClient redisson, RMapCache<Object, Object> mapCache, CacheConfig config) {
this.mapCache = mapCache; this.mapCache = mapCache;
this.map = mapCache; this.map = mapCache;
@ -66,12 +71,20 @@ public class RedissonCache implements Cache {
@Override @Override
public ValueWrapper get(Object key) { public ValueWrapper get(Object key) {
Object value = map.get(key); Object value = map.get(key);
if (value == null) {
addCacheMiss();
}else{
addCacheHit();
}
return toValueWrapper(value); return toValueWrapper(value);
} }
public <T> T get(Object key, Class<T> type) { public <T> T get(Object key, Class<T> type) {
Object value = map.get(key); Object value = map.get(key);
if (value != null) { if (value == null) {
addCacheMiss();
}else{
addCacheHit();
if (value.getClass().getName().equals(NullValue.class.getName())) { if (value.getClass().getName().equals(NullValue.class.getName())) {
return null; return null;
} }
@ -124,6 +137,7 @@ public class RedissonCache implements Cache {
public <T> T get(Object key, Callable<T> valueLoader) { public <T> T get(Object key, Callable<T> valueLoader) {
Object value = map.get(key); Object value = map.get(key);
if (value == null) { if (value == null) {
addCacheMiss();
RLock lock = map.getLock(key); RLock lock = map.getLock(key);
lock.lock(); lock.lock();
try { try {
@ -146,6 +160,8 @@ public class RedissonCache implements Cache {
} finally { } finally {
lock.unlock(); lock.unlock();
} }
}else{
addCacheHit();
} }
return (T) fromStoreValue(value); return (T) fromStoreValue(value);
@ -165,4 +181,26 @@ public class RedissonCache implements Cache {
return userValue; return userValue;
} }
/** The number of get requests that were satisfied by the cache.
* @return the number of hits
*/
long getCacheHits(){
return hits.get();
}
/** A miss is a get request that is not satisfied.
* @return the number of misses
*/
long getCacheMisses(){
return misses.get();
}
private void addCacheHit(){
hits.incrementAndGet();
}
private void addCacheMiss(){
misses.incrementAndGet();
}
} }

@ -0,0 +1,41 @@
/**
* Copyright 2017 Craig Andrews
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.redisson.spring.cache;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
*
* @author Craig Andrews
*
* {@link EnableAutoConfiguration Auto-configuration} for {@link RedissonCacheStatisticsProvider}
*
*/
@Configuration
@AutoConfigureAfter(CacheAutoConfiguration.class)
@ConditionalOnBean(CacheManager.class)
public class RedissonCacheStatisticsAutoConfiguration {
@Bean
public RedissonCacheStatisticsProvider redissonCacheStatisticsProvider(){
return new RedissonCacheStatisticsProvider();
}
}

@ -0,0 +1,38 @@
/**
* Copyright 2017 Craig Andrews
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.redisson.spring.cache;
import org.springframework.boot.actuate.cache.CacheStatistics;
import org.springframework.boot.actuate.cache.CacheStatisticsProvider;
import org.springframework.boot.actuate.cache.DefaultCacheStatistics;
import org.springframework.cache.CacheManager;
/**
*
* @author Craig Andrews
*
*/
public class RedissonCacheStatisticsProvider implements CacheStatisticsProvider<RedissonCache> {
@Override
public CacheStatistics getCacheStatistics(final CacheManager cacheManager, final RedissonCache cache) {
final DefaultCacheStatistics defaultCacheStatistics = new DefaultCacheStatistics();
defaultCacheStatistics.setSize((long) cache.getNativeCache().size());
defaultCacheStatistics.setGetCacheCounts(cache.getCacheHits(), cache.getCacheMisses());
return defaultCacheStatistics;
}
}

@ -0,0 +1 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.redisson.spring.cache.RedissonCacheStatisticsAutoConfiguration
Loading…
Cancel
Save