在SpringBoot中使用RedisTemplate,如果不指定序列化的方式,就会导致redis的key及value的可读性变差,所以,我们需要使用序列化的工具类,来序列化和反序列化数据。
注:
1.本文对于数据的key,都是用StringRedisSerializer的序列化方式,保证可读性。
2.使用同一批数据,不同的的序列化方式保存
@SpringBootTest
@RunWith(SpringRunner.class)
public class AuditDataApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void test1(){
List<Value> list=new ArrayList<>();
//数据1
Value value1=new Value();
value1.setId("1");
value1.setName("测试名称1");
value1.setValue("测试值1");
//数据2
Value value2=new Value();
value2.setId("2");
value2.setName("测试名称2");
value2.setValue("测试值2");
list.add(value1);
list.add(value2);
redisTemplate.opsForValue().set("test", list);
}
}
1.JdkSerializationRedisSerializer
优点:序列化后的长度最短,时间适中。
缺点:不是明文显示。
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
//采用JdkSerializationRedisSerializer序列化后的长度最短,时间适中,但不是明文显示
JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
// 设置值(value)的序列化
redisTemplate.setValueSerializer(jdkSerializationRedisSerializer);
redisTemplate.setHashValueSerializer(jdkSerializationRedisSerializer );
// 设置键(key)的序列化采用StringRedisSerializer。
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
结果
2.Jackson2JsonRedisSerializer
优点:序列化速度最快,长度适中
缺点:在使用过程中,timestamp类型的数据以long类型存储,反序列化会出现问题,如果存入redis的数据不存在这种特殊情况,推荐使用这种。
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
//采用Jackson2JsonRedisSerializer序列化速度最快,长度适中,
// 但会使存入redis中timestamp类型的数据以long类型存储,明文显示
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(List.class);
// 设置值(value)的序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer );
// 设置键(key)的序列化采用StringRedisSerializer。
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
结果:
3.GenericJackson2JsonRedisSerializer
优点:明文显示,在redis中显示了class字段保存有类型的包路径,还会显示字段的类型,反序列化更容易。
缺点:序列化时间最长,长度最大
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
//采用GenericJackson2JsonRedisSerializer序列化时间最长,长度最大,明文显示
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置值(value)的序列化
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer );
// 设置键(key)的序列化采用StringRedisSerializer。
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
结果:
总结
对于不同的情况可以使用不同的序列化方式,比较推荐使用JdkSerializationRedisSerializer和Jackson2JsonRedisSerializer,在保证速度的情况下,还能兼顾数据占用大小和明文显示。