springboot~RedisTemplate三種(zhong)序列化方式
RedisTemplate默認使用二進制hex的方式進行持久化,它對象的值存儲到redis里,當然,你的對象需要先實現java.io.Serializable接(jie)口,這(zhe)種方式兼容性(xing)好,速(su)度(du)快,存儲(chu)空間小;缺點就是沒有可讀(du)性(xing),所(suo)以就有了json的序列(lie)化方式,下(xia)面總(zong)結一(yi)下(xia)。
一 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);

綜上所(suo)述,我(wo)認為第三種json對象的(de)方式是比較(jiao)好的(de)處理方式,在序(xu)(xu)列化和反(fan)序(xu)(xu)列化,及可讀性(xing)上都表現不錯。