为什么只触发了一个缓存?(RedisCacheManager 和 CacheOperationInvocationContext 问题)

Why triggered only one cache? (RedisCacheManager and CacheOperationInvocationContext issue)

提问人:Pavlo Khomiak 提问时间:2/16/2023 最后编辑:Pavlo Khomiak 更新时间:2/16/2023 访问量:51

问:

我配置first_cache,它工作正常。 但是当我想在 FirstCasheResolver 中添加second_cache时,CacheOperationInvocationContext 只有一个缓存,而 RedisCacheManager 有两个缓存。 此外,SecondCacheResolver 甚至没有触发。 请帮帮我。

这是我的 CacheConfiguration 类

@EnableCaching
@Configuration
public class CacheConfiguration {
    public static final String FIRST_CACHE_NAME = "first_cache";
    public static final String SECOND_CACHE_NAME = "second_cache";
    private int defaultTokenExpirationTime = 1000;

    @Bean
    public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {
        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(getDefaultRedisCacheConfiguration())
                .withCacheConfiguration(FIRST_CACHE_NAME, getCustomRedisCacheConfiguration())
                .withCacheConfiguration(SECOND_CACHE_NAME, getCustomRedisCacheConfiguration())
                .build();
    }

    private RedisCacheConfiguration getDefaultRedisCacheConfiguration() {
        return RedisCacheConfiguration.defaultCacheConfig().disableCachingNullValues();
    }

    private RedisCacheConfiguration getCustomRedisCacheConfiguration() {
        return RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(defaultTokenExpirationTime));
    }

    @Bean("firstCacheResolver")
    public CacheResolver firstCacheResolver(RedisCacheManager redisCacheManager) {
        return new FirstCacheResolver(redisCacheManager);
    }

    @Bean("secondCacheResolver")
    public CacheResolver secondCacheResolver(RedisCacheManager redisCacheManager) {
        return new SecondCacheResolver(redisCacheManager);
    }
}

这是我的 FirstCacheResolver 类

public class FirstCacheResolver extends SimpleCacheResolver {

    public FirstCacheResolver(CacheManager cacheManager) {
        super(cacheManager);
    }

    @Override
    public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) {
        return super.resolveCaches(context).stream().toList();
    }
}

这里 super.resolveCaches(context) 只返回一个first_cache但 CacheManager 有 first_cache 和 second_cache

这是我的 SecondCacheResolver 类

public class SecondCacheResolver extends SimpleCacheResolver {

    public SecondCacheResolver(CacheManager cacheManager) {
        super(cacheManager);
    }

    @Override
    public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) {
        return super.resolveCaches(context).stream().toList();
    }
}

这个 resolveCaches() 方法甚至没有触发

以下是两个缓存的用法。他们

public class FirstClass {
    @Cacheable(
            cacheNames = {CacheConfiguration.FIRST_CACHE_NAME},
            key = "#params.get('first').get(0)",
            cacheResolver = "firstCacheResolver"
    )
    public int getFirst(MultiValueMap<String, Object> params) {
        // some logic
    }
}



public class SecondClass {
    @Cacheable(
            cacheNames = {CacheConfiguration.SECOND_CACHE_NAME},
            key = "#params.get('second').get(0)",
            cacheResolver = "secondCacheResolver"
    )
    public int getSecond(MultiValueMap<String, Object> params) {
        // some logic
    }
}

debug 中的 cacheManager

我尝试使用自定义 CacheResolvers 实现两个缓存。

java 缓存 redis-cache

评论


答: 暂无答案