T A*_*nna 4 java json arraylist redis spring-boot
我正在使用 Redis 和 Spring boot。我使用 String 作为键,并将其对应的值作为复杂 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());
}
}
Run Code Online (Sandbox Code Playgroud)
缓存工作正常,通过我的应用程序进行序列化/反序列化似乎也可以工作。但是当我使用 redis-cli 时,当我使用命令 KEYS * 时,我会看到以下内容
1) "schools::ABC"
Run Code Online (Sandbox Code Playgroud)
现在 ABC 键的值应该是复杂对象的列表。但是当我得到“学校::ABC”时
我得到带有奇怪字符的值,如下所示:
\xac\xed\x00\x05sr\x00\x13java.util.ArrayListx\x81\xd2\x1d\x99\xc7a\x9d\x03\x00\x01I\x00\x04sizeexp\x00\x00\x00\x01w\x04\x00 \x00\x00\x01sr\x00(com.example.等等....
为什么会这样呢?
另外,我尝试将 valueSerializer 配置中的 GenericJackson2JsonRedisSerializer 更新为 Jackson2JsonRedisSerializer。结果没有什么不同。
另外,我尝试获取键的类型,结果为“字符串”,因此列表存储为字符串。
您之所以看到这些奇怪的字符,是因为它是二进制数据。
您将 GenericJackson2JsonRedisSerializer 配置为值的序列化器。该类在内部调用 ObjectMapper#writeValueAsBytes(...) ,顾名思义,它将您输入的值转换为字节。
这是可以预料的。Redis不直接支持存储Java对象。但是它确实支持存储二进制数据。通过使用 Jackson,我们可以将 Java 对象转换为字节并将其存储在 Redis 中。当然,反过来也可行。
归档时间: |
|
查看次数: |
11062 次 |
最近记录: |