经测试:
使用GenericJacksonRedisSerializer序列化反序列化耗时:1467
使用Jackson2JsonRedisSerializer序列化反序列化耗时:914
/**
* 重写Redis序列化方式,使用Json方式:
* 当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据库的。RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedisTemplate默认使用的是StringRedisSerializer。
* Spring Data JPA为我们提供了下面的Serializer:
* GenericToStringSerializer、Jackson2JsonRedisSerializer、JacksonJsonRedisSerializer、JdkSerializationRedisSerializer、OxmSerializer、StringRedisSerializer。
* 在此我们将自己配置RedisTemplate并定义Serializer。
*
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
// GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
/**
* GenericJackson2JsonRedisSerializer和Jackson2JsonRedisSerializer序列化区别在于:
* 1、使用Jackson2JsonRedisSerializer需要指明序列化的类Class,可以使用Obejct.class
*
* 2、使用GenericJacksonRedisSerializer比Jackson2JsonRedisSerializer效率低,占用内存高。
*
* 3、Jackson2JsonRedisSerializer反序列化带泛型的数组类会报转换异常,解决办法存储以JSON字符串存储。
*
* 4、GenericJacksonRedisSerializer和Jackson2JsonRedisSerializer都是以JSON格式去存储数据,都可以作为Redis的序列化方式。
*/
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
// 设置值(value)的序列化采用FastJsonRedisSerializer。
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
// 设置键(key)的序列化采用StringRedisSerializer。
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
总结
1、使用Jackson2JsonRedisSerializer需要指明序列化的类Class,可以使用Obejct.class
2、使用GenericJacksonRedisSerializer比Jackson2JsonRedisSerializer效率低,占用内存高。
3、Jackson2JsonRedisSerializer反序列化带泛型的数组类会报转换异常,解决办法存储以JSON字符串存储。
4、GenericJacksonRedisSerializer和Jackson2JsonRedisSerializer都是以JSON格式去存储数据,都可以作为Redis的序列化方式。
存储示例:
//使用Jackson2JsonRedisSerializer取数据时:
List<UserToken> list2 = (List<UserToken>)redisTemplate.opsForValue().get("test");
list2.forEach(userToken1 -> System.out.println(userToken1.getMobile()));
//异常如下:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.com.baisq.model.UserToken
//存储改为:
redisTemplate.opsForValue().set("test4",JSON.toJSONString(userToken),5,TimeUnit.MINUTES);