Redis Cache缓存数据生成的key是由两部分组成,cacheNames和+d或者自定义生成方案,如果采用cacheNames+id方案则会在中间添加两个冒号::,这样使用工具查看的时候感觉怪怪的,今天我们就探讨下具体生成原因。
一、CacheKeyPrefix钩子回调接口
java
@FunctionalInterface
public interface CacheKeyPrefix {
String SEPARATOR = "::";
String compute(String cacheName);
static CacheKeyPrefix simple() {
return name -> name + SEPARATOR;
}
static CacheKeyPrefix prefixed(String prefix) {
Assert.notNull(prefix, "Prefix must not be null");
return name -> prefix + name + SEPARATOR;
}
}
回调函数定义了simple()和prefixed()两个方法将定义的name和双冒号拼接
二、具体使用代码RedisCacheConfiguration#prefixCacheNameWith
java
/**
* Prefix the {@link RedisCache#getName() cache name} with the given value. <br />
* The generated cache key will be: {@code prefix + cache name + "::" + cache entry key}.
*
* @param prefix the prefix to prepend to the cache name.
* @return new {@link RedisCacheConfiguration}.
* @see #computePrefixWith(CacheKeyPrefix)
* @see CacheKeyPrefix#prefixed(String)
* @since 2.3
*/
public RedisCacheConfiguration prefixCacheNameWith(String prefix) {
return computePrefixWith(CacheKeyPrefix.prefixed(prefix));
}
注解标记拼接方案是:prefix + cache name + "::" + cache entry key
三、配置类RedisCacheConfiguration#createConfiguration调用上述方法
java
private org.springframework.data.redis.cache.RedisCacheConfiguration createConfiguration(
CacheProperties cacheProperties, ClassLoader classLoader) {
Redis redisProperties = cacheProperties.getRedis();
org.springframework.data.redis.cache.RedisCacheConfiguration config = org.springframework.data.redis.cache.RedisCacheConfiguration
.defaultCacheConfig();
config = config
.serializeValuesWith(SerializationPair.fromSerializer(new JdkSerializationRedisSerializer(classLoader)));
if (redisProperties.getTimeToLive() != null) {
config = config.entryTtl(redisProperties.getTimeToLive());
}
if (redisProperties.getKeyPrefix() != null) {
// 配置cacheName组合方案
config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());
}
if (!redisProperties.isCacheNullValues()) {
config = config.disableCachingNullValues();
}
if (!redisProperties.isUseKeyPrefix()) {
config = config.disableKeyPrefix();
}
return config;
}