1

同じパラメーターで別のメソッドを使用@Cacheableして呼び出すと、同じキーが生成されました。 SimpleKeyGeneratorキャッシュ名なしで生成されたキー。

spring-boot 1.3.2 と spring 4.2.4 を使用しています。

以下にサンプルを示します。

@Component
public static class CacheableTestClass {

    @Cacheable(cacheNames = "test-cacheproxy-echo1")
    public String echo1(String text) {
        return text;
    }

    @Cacheable(cacheNames = "test-cacheproxy-echo2")
    public String echo2(String text) {
        return "Another " + text;
    }
}

そして、テストを実行します:

assertEquals("OK", cacheableTestClass.echo1("OK"));
assertEquals("Another OK", cacheableTestClass.echo2("OK")); // Failure: expected 'Another OK', actual 'OK'.

それで、この問題を解決する方法はありますか?どうもありがとう。

アップデート

これが私のCacheManager構成です。

@Bean
@ConditionalOnMissingBean(name = "cacheRedisTemplate")
public RedisTemplate<Object, Object> cacheRedisTemplate(
        RedisConnectionFactory redisConnectionFactory)
        throws UnknownHostException {
    RedisTemplate<Object, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory);
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    template.setHashKeySerializer(template.getKeySerializer());
    return template;
}

@Bean
public RedisCacheManager cacheManager(@Qualifier("cacheRedisTemplate")  RedisTemplate<Object, Object> cacheRedisTemplate) {
    RedisCacheManager cacheManager = new RedisCacheManager(cacheRedisTemplate);
    cacheManager.setDefaultExpiration(
            redisCacheProperties().getDefaultExpiration());
    cacheManager.setExpires(redisCacheProperties().getExpires());
    return cacheManager;
}
4

1 に答える 1

4

これは何の関係もSimpleKeyGeneratorありませんが、値を格納するために使用するキーの判別式としてキャッシュの名前を使用しない、redis 固有の問題です。

で呼び出す必要がありsetUsePrefix(true)ますRedisCacheManager。これは、Spring Boot がキャッシュ マネージャーを自動構成するときに行うことです。これはデフォルトである必要があり、将来のリリースですぐに使用できるエクスペリエンスを改善する方法について話し合っていることに注意してください。

于 2016-05-26T08:16:22.030 に答える