Add an autoconfigured Spring Boot CacheStatisticsProvider implementation

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

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

@ -18,6 +18,7 @@ package org.redisson.spring.cache;
import java.lang.reflect.Constructor;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import org.redisson.api.RLock;
import org.redisson.api.RMap;
@ -41,6 +42,10 @@ public class RedissonCache implements Cache {
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) {
this.mapCache = mapCache;
this.map = mapCache;
@ -66,12 +71,20 @@ public class RedissonCache implements Cache {
@Override
public ValueWrapper get(Object key) {
Object value = map.get(key);
if (value == null) {
addCacheMiss();
}else{
addCacheHit();
}
return toValueWrapper(value);
}
public <T> T get(Object key, Class<T> type) {
Object value = map.get(key);
if (value != null) {
if (value == null) {
addCacheMiss();
}else{
addCacheHit();
if (value.getClass().getName().equals(NullValue.class.getName())) {
return null;
}
@ -124,6 +137,7 @@ public class RedissonCache implements Cache {
public <T> T get(Object key, Callable<T> valueLoader) {
Object value = map.get(key);
if (value == null) {
addCacheMiss();
RLock lock = map.getLock(key);
lock.lock();
try {
@ -146,6 +160,8 @@ public class RedissonCache implements Cache {
} finally {
lock.unlock();
}
}else{
addCacheHit();
}
return (T) fromStoreValue(value);
@ -165,4 +181,26 @@ public class RedissonCache implements Cache {
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