diff --git a/redisson/pom.xml b/redisson/pom.xml index 532504847..b52c6f10f 100644 --- a/redisson/pom.xml +++ b/redisson/pom.xml @@ -244,6 +244,12 @@ 1.2.2.RELEASE provided + + org.springframework.boot + spring-boot-actuator + [1.4,) + provided + diff --git a/redisson/src/main/java/org/redisson/spring/cache/RedissonCache.java b/redisson/src/main/java/org/redisson/spring/cache/RedissonCache.java index fc44f108d..21975c0bd 100644 --- a/redisson/src/main/java/org/redisson/spring/cache/RedissonCache.java +++ b/redisson/src/main/java/org/redisson/spring/cache/RedissonCache.java @@ -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 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 get(Object key, Class 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 get(Object key, Callable 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(); + } + } diff --git a/redisson/src/main/java/org/redisson/spring/cache/RedissonCacheStatisticsAutoConfiguration.java b/redisson/src/main/java/org/redisson/spring/cache/RedissonCacheStatisticsAutoConfiguration.java new file mode 100644 index 000000000..400a9b4b7 --- /dev/null +++ b/redisson/src/main/java/org/redisson/spring/cache/RedissonCacheStatisticsAutoConfiguration.java @@ -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(); + } +} diff --git a/redisson/src/main/java/org/redisson/spring/cache/RedissonCacheStatisticsProvider.java b/redisson/src/main/java/org/redisson/spring/cache/RedissonCacheStatisticsProvider.java new file mode 100644 index 000000000..d2f200269 --- /dev/null +++ b/redisson/src/main/java/org/redisson/spring/cache/RedissonCacheStatisticsProvider.java @@ -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 { + + @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; + } + +} diff --git a/redisson/src/main/resources/META-INF/spring.factories b/redisson/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..fd22323d4 --- /dev/null +++ b/redisson/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.redisson.spring.cache.RedissonCacheStatisticsAutoConfiguration