RedisTemplate系列化器之GenericJackson2JsonRedisSerializer

Redis作为高速缓存数据库,目前应用非常广泛。RedisTemplate是Spring提供用于操作redis数据库的一个类。
将数据存放到Redis中,以及数据读取。这里必然涉及到数据的系列化和反系列化。RedisTemplate默认的系列化类是JdkSerializationRedisSerializer,用JdkSerializationRedisSerializer序列化的话,被序列化的对象必须实现Serializable接口。在存储内容时,除了属性的内容外还存了其它内容在里面,总长度长,且不容易阅读。
我们要求是存储的数据可以方便查看,也方便反系列化,方便读取数据。
JacksonJsonRedisSerializer和GenericJackson2JsonRedisSerializer,两者都能系列化成json,但是后者会在json中加入@class属性,类的全路径包名,方便反系列化。前者如果存放了List则在反系列化的时候如果没指定TypeReference则会报错java.util.LinkedHashMap cannot be cast to 。

在项目中我们可以灵活设置RedisTemplate的系列化器。
这里写图片描述

我们可以看到RedisTemplate里面定义了key,value,hashKey,haskValue等键,值的系列化器,我们可以自己方便的修改。如果没有设置则会有默认的。
JdkSerializationRedisSerializer。

实例:设置RedisTemplate系列化。GenericJackson2JsonRedisSerializer系列化和反系列化使用的是ObjectMapper

package com.xfl.boot.common.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * Created by XFL
 * time on 2017/6/12 23:24
 * description:
 */
@Configuration
public class RedisConfig {
    private static Logger logger = LoggerFactory.getLogger(RedisConfig.class);

    @Bean(name = "springSessionDefaultRedisSerializer")
    public GenericJackson2JsonRedisSerializer getGenericJackson2JsonRedisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }
    @Bean
    public RedisTemplate getRedisTemplate(
            JedisConnectionFactory connectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(connectionFactory);
        redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        return redisTemplate;
    }
}
//数据取出示例:
RespCallbackDto respCallbackDto = (RespCallbackDto) redisTemplate.opsForHash().get(key, prvId);

这里写图片描述
可以看到保存到redis数据库中的数据是json,并且每个节点都有@class属性,这些属性在凡系列化时会使用到。

参考资料:https://zhuanlan.zhihu.com/p/29195530

你可能感兴趣的:(java,Redis,Spring)