Redis通过实现RedisSerializer<T>自定义序列化器与反序列化器。以fastJson Serializer为例:

    1. public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {
    2. public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
    3. private Class<T> clazz;
    4. public FastJsonRedisSerializer(Class<T> clazz) {
    5. super();
    6. this.clazz = clazz;
    7. }
    8. @Override
    9. public byte[] serialize(T t) throws SerializationException {
    10. if (t == null) {
    11. return new byte[0];
    12. }
    13. return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
    14. }
    15. @Override
    16. public T deserialize(byte[] bytes) throws SerializationException {
    17. if (bytes == null || bytes.length <= 0) {
    18. return null;
    19. }
    20. String str = new String(bytes, DEFAULT_CHARSET);
    21. return (T) JSON.parseObject(str, clazz);
    22. }
    23. }

    序列化器使用方法如下:

    1. @Configuration
    2. public class RedisConfig {
    3. /**
    4. * 重写Redis序列化方式,使用Json方式:
    5. * 当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据库的。RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedisTemplate默认使用的是StringRedisSerializer。
    6. * Spring Data JPA为我们提供了下面的Serializer:
    7. * GenericToStringSerializer、Jackson2JsonRedisSerializer、JacksonJsonRedisSerializer、JdkSerializationRedisSerializer、OxmSerializer、StringRedisSerializer。
    8. * 在此我们将自己配置RedisTemplate并定义Serializer。
    9. *
    10. * @param redisConnectionFactory
    11. * @return
    12. */
    13. @Bean
    14. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    15. RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    16. redisTemplate.setConnectionFactory(redisConnectionFactory);
    17. FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
    18. // 全局开启AutoType,不建议使用
    19. // ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
    20. // 建议使用这种方式,小范围指定白名单
    21. ParserConfig.getGlobalInstance().addAccept("com.longge.");
    22. // 设置值(value)的序列化采用FastJsonRedisSerializer。
    23. redisTemplate.setValueSerializer(fastJsonRedisSerializer);
    24. redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
    25. // 设置键(key)的序列化采用StringRedisSerializer。
    26. redisTemplate.setKeySerializer(new StringRedisSerializer());
    27. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    28. redisTemplate.afterPropertiesSet();
    29. return redisTemplate;
    30. }
    31. }