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として格納されます。
Redisの設定は問題ないようですが、保存手順のタイプについては触れていません。データを格納する別の方法を使用する必要があるかもしれません。たとえば、あなたは試すことができます
redisTemplate.opsForHash().put('yourKey','yourHashKey', objectValue);
以下のように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の値も見ることができます