Spring @Cacheable 自定义缓存key(key-prefix覆盖cahcheNames如何解决)

利用RedisCacheConfiguration.defaultCacheConfig().computePrefixWith即可自定义cacheName的生成策略

参考redis issue

以下是具体的Configuration

@Configuration
public class CacheManager {

    @Value("${spring.cache.redis.time-to-live:3600000}")
    private long ttl;

    @Value("${spring.cache.redis.key-prefix:ware}")
    private String prefixKey;

    @Value("${spring.cache.redis.user-key-prefix:true}")
    private boolean usePrefixKey;

    @Primary
    @Bean
    public RedisCacheManager defaultManager(RedisCacheWriter redisCacheWriter) {
        RedisCacheConfiguration cacheConfiguration =
                defaultConfig()
                        .entryTtl(Duration.ofMillis(ttl));
        return new RedisCacheManager(redisCacheWriter, cacheConfiguration);
    }


    @Bean
    public RedisCacheWriter redisCacheWriter(RedisConnectionFactory connectionFactory) {
        return RedisCacheWriter.lockingRedisCacheWriter(connectionFactory);
    }


    @NotNull
    private RedisCacheConfiguration defaultConfig() {
        RedisSerializationContext.SerializationPair<Object> valueSerializationPair = RedisSerializationContext.SerializationPair
                .fromSerializer(new GenericJackson2JsonRedisSerializer());
        return RedisCacheConfiguration.defaultCacheConfig()
                        .serializeValuesWith(valueSerializationPair)
                //缓存名称生成策略:[prefix]::[cacheName]::[keys]
                        .computePrefixWith(cacheName ->
                                (usePrefixKey ? String.format("%s::", prefixKey) : "")  + String.format("%s::", cacheName)
                        );
    }
}