From d6d5b9e6102b0eccfc6ef36688593f2d8d8d28af Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Fri, 16 Feb 2018 10:54:02 +0100 Subject: [PATCH] DATAREDIS-715 - Polishing. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rename prefixKeysWith(CacheKeyPrefix) to computePrefixWith(…) and drop computePrefixWith(Function) in favor of CacheKeyPrefix. Refactor nullable keyPrefix to non-nullable. Extract default prefixing scheme to CacheKeyPrefix.simple(). Original pull request: #313. --- .../data/redis/cache/CacheKeyPrefix.java | 11 ++++ .../data/redis/cache/RedisCache.java | 4 +- .../redis/cache/RedisCacheConfiguration.java | 55 ++++++------------- 3 files changed, 30 insertions(+), 40 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/cache/CacheKeyPrefix.java b/src/main/java/org/springframework/data/redis/cache/CacheKeyPrefix.java index 41e446932..7c3e3a945 100644 --- a/src/main/java/org/springframework/data/redis/cache/CacheKeyPrefix.java +++ b/src/main/java/org/springframework/data/redis/cache/CacheKeyPrefix.java @@ -20,6 +20,7 @@ package org.springframework.data.redis.cache; * Redis. * * @author Christoph Strobl + * @author Mark Paluch * @since 2.0.4 */ @FunctionalInterface @@ -32,4 +33,14 @@ public interface CacheKeyPrefix { * @return never {@literal null}. */ String compute(String cacheName); + + /** + * Creates a default {@link CacheKeyPrefix} scheme that prefixes cache keys with {@code cacheName} followed by double + * colons. A cache named {@code myCache} will prefix all cache keys with {@code myCache::}. + * + * @return the default {@link CacheKeyPrefix} scheme. + */ + static CacheKeyPrefix simple() { + return name -> name + "::"; + } } diff --git a/src/main/java/org/springframework/data/redis/cache/RedisCache.java b/src/main/java/org/springframework/data/redis/cache/RedisCache.java index c9456db3d..4ad8293ee 100644 --- a/src/main/java/org/springframework/data/redis/cache/RedisCache.java +++ b/src/main/java/org/springframework/data/redis/cache/RedisCache.java @@ -300,7 +300,9 @@ public class RedisCache extends AbstractValueAdaptingCache { } private String prefixCacheKey(String key) { - return cacheConfig.getKeyPrefixFor(name).orElseGet(() -> name + "::") + key; + + // allow contextual cache names by computing the key prefix on every call. + return cacheConfig.getKeyPrefixFor(name) + key; } private static T valueFromLoader(Object key, Callable valueLoader) { diff --git a/src/main/java/org/springframework/data/redis/cache/RedisCacheConfiguration.java b/src/main/java/org/springframework/data/redis/cache/RedisCacheConfiguration.java index 32030c263..baec542f3 100644 --- a/src/main/java/org/springframework/data/redis/cache/RedisCacheConfiguration.java +++ b/src/main/java/org/springframework/data/redis/cache/RedisCacheConfiguration.java @@ -18,7 +18,6 @@ package org.springframework.data.redis.cache; import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.Optional; -import java.util.function.Function; import org.springframework.cache.Cache; import org.springframework.cache.interceptor.SimpleKey; @@ -27,7 +26,6 @@ import org.springframework.core.convert.converter.ConverterRegistry; import org.springframework.data.redis.serializer.RedisSerializationContext.SerializationPair; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.format.support.DefaultFormattingConversionService; -import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -44,7 +42,7 @@ public class RedisCacheConfiguration { private final Duration ttl; private final boolean cacheNullValues; - private final @Nullable CacheKeyPrefix keyPrefix; + private final CacheKeyPrefix keyPrefix; private final boolean usePrefix; private final SerializationPair keySerializationPair; @@ -54,7 +52,7 @@ public class RedisCacheConfiguration { @SuppressWarnings("unchecked") private RedisCacheConfiguration(Duration ttl, Boolean cacheNullValues, Boolean usePrefix, - @Nullable CacheKeyPrefix keyPrefix, SerializationPair keySerializationPair, + CacheKeyPrefix keyPrefix, SerializationPair keySerializationPair, SerializationPair valueSerializationPair, ConversionService conversionService) { this.ttl = ttl; @@ -94,7 +92,7 @@ public class RedisCacheConfiguration { registerDefaultConverters(conversionService); - return new RedisCacheConfiguration(Duration.ZERO, true, true, null, + return new RedisCacheConfiguration(Duration.ZERO, true, true, CacheKeyPrefix.simple(), SerializationPair.fromSerializer(RedisSerializer.string()), SerializationPair.fromSerializer(RedisSerializer.java()), conversionService); } @@ -123,37 +121,23 @@ public class RedisCacheConfiguration { Assert.notNull(prefix, "Prefix must not be null!"); - return prefixKeysWith((cacheName) -> prefix); + return computePrefixWith((cacheName) -> prefix); } /** - * Use the given {@link CacheKeyPrefix} computing the prefix based on the {@literal cache name}. - * - * @param prefix must not be {@literal null}. - * @return new {@link RedisCacheConfiguration}. - * @since 2.0.4 - */ - public RedisCacheConfiguration prefixKeysWith(CacheKeyPrefix prefix) { - - Assert.notNull(prefix, "Prefix must not be null!"); - - return new RedisCacheConfiguration(ttl, cacheNullValues, true, prefix, keySerializationPair, valueSerializationPair, - conversionService); - } - - /** - * Use the given {@link Function} to compute the prefix for the actual Redis {@literal key} on the + * Use the given {@link CacheKeyPrefix} to compute the prefix for the actual Redis {@literal key} on the * {@literal cache name}. * - * @param function must not be {@literal null}. + * @param cacheKeyPrefix must not be {@literal null}. * @return new {@link RedisCacheConfiguration}. * @since 2.0.4 */ - public RedisCacheConfiguration computePrefixWith(Function function) { + public RedisCacheConfiguration computePrefixWith(CacheKeyPrefix cacheKeyPrefix) { - Assert.notNull(function, "Function for computing prefix must not be null!"); + Assert.notNull(cacheKeyPrefix, "Function for computing prefix must not be null!"); - return prefixKeysWith(function::apply); + return new RedisCacheConfiguration(ttl, cacheNullValues, true, cacheKeyPrefix, keySerializationPair, + valueSerializationPair, conversionService); } /** @@ -228,9 +212,9 @@ public class RedisCacheConfiguration { * @return never {@literal null}. * @deprecated since 2.0.4. Please use {@link #getKeyPrefixFor(String)}. */ - @Deprecated() + @Deprecated public Optional getKeyPrefix() { - return getCacheKeyPrefix().map(val -> val.compute("")); + return usePrefix() ? Optional.of(keyPrefix.compute("")) : Optional.empty(); } /** @@ -239,18 +223,11 @@ public class RedisCacheConfiguration { * @return never {@literal null}. * @since 2.0.4 */ - public Optional getKeyPrefixFor(String cacheName) { - return getCacheKeyPrefix().map(val -> val.compute(cacheName)); - } + public String getKeyPrefixFor(String cacheName) { - /** - * Obtain the {@link CacheKeyPrefix} used to compute the actual {@literal key} prefix. - * - * @return never {@literal null}. - * @since 2.0.4 - */ - public Optional getCacheKeyPrefix() { - return Optional.ofNullable(keyPrefix); + Assert.notNull(cacheName, "Cache name must not be null!"); + + return keyPrefix.compute(cacheName); } /**