7

この回答によるとRedisTemplate、値に対して複数のシリアライザーをサポートすることはできません。そのため、さまざまなニーズに合わせて複数の RedisTemplates を作成したいと考えています。具体的には、1 つは文字列アクション用、もう 1 つはオブジェクトから JSON へのシリアライゼーション用で、RedisCacheManager. 私は Spring Boot を使用しており、現在は自動配線されています。同じ Jedis 接続ファクトリを共有しているが、独自のシリアライザーをRedisTemplate持つ 2 番目のインスタンスを宣言する正しい方法は何だろうか?RedisTemplate

2つの異なるコンポーネントでこのようなことを試しましたが、

コンポーネント 1 は次のように宣言します。

    @Autowired
    private RedisTemplate redisTemplate;

    redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Instance.class));

コンポーネント 2 は次のように宣言します。

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

この場合、2 つのテンプレートは実際には同じです。Spring コードをトレースすると、コンポーネント 1 のテンプレートが autoconfigured に解決されていることがわかりましたstringRedisTemplate

RedisTemplateのコンストラクタを手動で呼び出しafterPropertiesSet()ても、接続ファクトリが見つからないと不平を言うため、機能しません。

このリクエストはおそらく、Spring アプリで別の Bean を定義することと大きな違いはないことはわかっていますが、現在の Spring-Data-Redis 統合では、何が最善の方法なのかわかりません。助けてください、ありがとう。

4

1 に答える 1

12

RedisTemplate1 つの Spring Boot アプリケーション内で複数の を使用する方法は 2 つあります。

  1. 名前付き Bean インジェクション で@Autowired @Qualifier("beanname") RedisTemplate myTemplateBean を作成します@Bean(name = "beanname")
  2. 型パラメータを指定することによるタイプ セーフ インジェクションRedisTemplate(例:@Autowired RedisTemplate<byte[], byte[]> byteTemplateおよび @Autowired RedisTemplate<String, String> stringTemplate)。

2つの異なるものを作成するコードは次のとおりです。

@Configuration
public class Config {

    @Bean
    public RedisTemplate<String, String> stringTemplate(RedisConnectionFactory redisConnectionFactory) {

        RedisTemplate<String, String> stringTemplate = new RedisTemplate<>();
        stringTemplate.setConnectionFactory(redisConnectionFactory);
        stringTemplate.setDefaultSerializer(new StringRedisSerializer());
        stringTemplate.afterPropertiesSet();

        return stringTemplate;
    }

    @Bean
    public RedisTemplate<byte[], byte[]> byteTemplate(RedisConnectionFactory redisConnectionFactory) {

        RedisTemplate<byte[], byte[]> byteTemplate = new RedisTemplate<>();
        byteTemplate.setConnectionFactory(redisConnectionFactory);
        byteTemplate.afterPropertiesSet();

        return byteTemplate;
    }

}

HTH、マーク

于 2016-02-21T21:20:45.950 に答える