Springboot2.0整合Redis时的序列化与反序列化

首先说一下环境:

  • springboot:2.1.7
  • redis:5.0.5

在默认的情况下,两者整合后便可将数据缓存到redis,但是缓存进去的对象类型数据是经过jdk默认序列化过后的,在可视化工具中是HEX格式,看起来非常不方便,所以需要进行格式化
Springboot2.0整合Redis时的序列化与反序列化_第1张图片
首先创建FastJsonRedisSerializer类实现RedisSerializer接口

public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {
    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
    private Class<T> clazz;
    public FastJsonRedisSerializer(Class<T> clazz) {
        super();
        this.clazz = clazz;
    }
    @Override
    public byte[] serialize(T t) throws SerializationException {
        if (t == null) {
            return new byte[0];
        }
        return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
    }
    @Override
    public T deserialize(byte[] bytes) throws SerializationException {
        if (bytes == null || bytes.length <= 0) {
            return null;
        }
        String str = new String(bytes, DEFAULT_CHARSET);
        return JSON.parseObject(str, clazz);
    }

然后编写配置类,注入组件

/**
     * 设置 redis 数据默认过期时间
     * 设置@cacheable 序列化方式
     *
     * @return
     */
    @Bean
    public RedisCacheConfiguration redisCacheConfiguration() {
        FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
        RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig();
        configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)).entryTtl(Duration.ofDays(30));
        return configuration;
    }

此时便可将数据以json格式的形式存入Redis中
Springboot2.0整合Redis时的序列化与反序列化_第2张图片

但此时当我们从Redis中获取数据时将会报错

com.alibaba.fastjson.JSONException: autoType is not support

百度搜索原因是反序列化有问题
需要在FastJsonRedisSerializer类中的deserialize方法加如下代码即可:

ParserConfig.getGlobalInstance().setAutoTypeSupport(true);

以上便是解决序列化与反序列化的方法,但是具体的代码编写原因及实现过程还不太明白。若有更好的方法或文章可留言分享。

你可能感兴趣的:(java-redis,java-SpringBoot)