web-dev-qa-db-ja.com

Spring Boot RedisはPOJOのリストを値として保存します

SpringブートでRedisを使用しています。文字列をキーとして使用し、それに対する値を複雑なPOJOのリストとして使用しています。以下は私の設定です:

@Configuration
@EnableCaching
@Slf4j
public class RedisCacheConfig extends CachingConfigurerSupport {

private static final long DEFAULT_CACHE_EXPIRES = 60;

@Bean
public RedisTemplate<String, Object> redisTemplate(final RedisConnectionFactory redisConnectionFactory) {
    final RedisTemplate<String, Object> template = new RedisTemplate<>();
    setRedisTemplateConfigValues(redisConnectionFactory, template);
    return template;
}

@Bean
public CacheManager cacheManager(final RedisConnectionFactory redisConnectionFactory) {
    Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();

    return RedisCacheManager
            .builder(redisConnectionFactory)
            .cacheDefaults(createCacheConfiguration())
            .withInitialCacheConfigurations(cacheConfigurations).build();
}

private static RedisCacheConfiguration createCacheConfiguration() {
    return RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofSeconds(DEFAULT_CACHE_EXPIRES));
}

private <T> void setRedisTemplateConfigValues(final RedisConnectionFactory redisConnectionFactory,
                                              final RedisTemplate<String, T> template) {

    template.setConnectionFactory(redisConnectionFactory);
    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    template.setHashKeySerializer(new StringRedisSerializer());
    template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
}
}

Cahcingは正常に機能しており、私のアプリによるシリアル化/非シリアル化も機能しているようです。しかし、redis-cliを使用すると、KEYSコマンドを使用すると以下が表示されます*

1) "schools::ABC"

ABCキーに対する値は、複雑なオブジェクトのリストになるはずです。しかし、GET "schools :: ABC"を実行すると

以下のように奇妙な文字で値を取得します:

\ xac\xed\x00\x05sr\x00\x13Java.util.ArrayListx\x81\xd2\x1d\x99\xc7a\x9d\x03\x00\x01I\x00\x04sizexp\x00\x00\x00\x01w\x04\x00\x00\x00\x01sr\x00(com.example。など)...

なぜそうなのですか?

また、valueSerializerの構成のGenericJackson2JsonRedisSerializerをJackson2JsonRedisSerializerに更新してみました。結果は変わりませんでした。

また、キーのTYPEを取得しようとしましたが、結果は「String」として取得されるため、リストはStringとして格納されます。

3
T Anna

Redisの設定は問題ないようですが、保存手順のタイプについては触れていません。データを格納する別の方法を使用する必要があるかもしれません。たとえば、あなたは試すことができます

redisTemplate.opsForHash().put('yourKey','yourHashKey', objectValue);
0

以下のようにcachemanager Beanでシリアライザを設定してみてください

@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
    RedisSerializationContext.SerializationPair<Object> jsonSerializer = RedisSerializationContext.SerializationPair
            .fromSerializer(new GenericJackson2JsonRedisSerializer());

    RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
            .serializeValuesWith(jsonSerializer);

    return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory)
            .cacheDefaults(config).build();
}

これは私のために働きました。私はjsonとしてredis guiの値も見ることができます

0
sachin