RedisTemplate默認使用二進制hex的方式進行持久化,它對象的值存儲到redis裏,當然,你的對象需要先實現java.io.Serializable
接口,這種方式兼容性好,速度快,存儲空間小;缺點就是沒有可讀性,所以就有了json的序列化方式,下面總結一下。
一 JdkSerializationRedisSerializer二進制流的方式
@Test
public void hex() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
//二進制序列化,實體類需要實現Serializable接口
JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
//序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setValueSerializer(jdkSerializationRedisSerializer);
template.setHashValueSerializer(jdkSerializationRedisSerializer);
template.afterPropertiesSet();
extracted(template, "redis_test111");
User user = (User) template.opsForValue().get("redis_test111");
}
二 Jackson2JsonRedisSerializer純json字符串
@Test
public void jsonStr() throws IOException {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer =
new Jackson2JsonRedisSerializer<>(Object.class);
//序列化
jackson2JsonRedisSerializer.setObjectMapper(new ObjectMapper());
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
extracted(template, "redis_test11");
JsonParser jsonParser = mapper.getFactory().createParser(mapper.writeValueAsBytes(template.opsForValue().get("redis_tesqt")));
User jsonNode = jsonParser.readValueAs(User.class);
log.info("user={}", jsonNode);
}
三 Jackson2JsonRedisSerializer帶有java類型的方式
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 日期序列化處理
om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
om.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule())
.registerModule(new ParameterNamesModule());
//存儲java的類型,方便反序列化,沒有這行,將存儲爲純json字符串
om.activateDefaultTyping(
LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.WRAPPER_ARRAY);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key採用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也採用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式採用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式採用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
extracted(template, "redis_test1");
User user = (User) template.opsForValue().get("redis_test");
log.info("user={}", user);
綜上所述,我認爲第三種json對象的方式是比較好的處理方式,在序列化和反序列化,及可讀性上都表現不錯。