Redis序列化原理

我们在IDEA中创建redis对象一般是使用RedisTemplate类的opsForxxx()方法创建一个redis对象,然后存储数据.

public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware {
    private boolean enableTransactionSupport = false;
    private boolean exposeConnection = false;
    private boolean initialized = false;
    private boolean enableDefaultSerializer = true;

 public void afterPropertiesSet() {
        super.afterPropertiesSet();
        boolean defaultUsed = false;
        if (this.defaultSerializer == null) {
            this.defaultSerializer = new JdkSerializationRedisSerializer(this.classLoader != null ? this.classLoader : this.getClass().getClassLoader());
        }

        if (this.enableDefaultSerializer) {
            if (this.keySerializer == null) {
                this.keySerializer = this.defaultSerializer;
                defaultUsed = true;
            }

            if (this.valueSerializer == null) {
                this.valueSerializer = this.defaultSerializer;
                defaultUsed = true;
            }

            if (this.hashKeySerializer == null) {
                this.hashKeySerializer = this.defaultSerializer;
                defaultUsed = true;
            }

            if (this.hashValueSerializer == null) {
                this.hashValueSerializer = this.defaultSerializer;
                defaultUsed = true;
            }
        }
}

如上述代码所示,如果你在使用RedisTemplate生成的对象时没有指定key,value的序列化方式,它会自动使用jdk序列化方式序列化redis存入的key和value.

然后说下他什么时候执行的序列化

由上述代码可以看到RedisTemplate继承了RedisAccessor 

public class RedisAccessor implements InitializingBean {
    protected final Log logger = LogFactory.getLog(this.getClass());
    @Nullable
    private RedisConnectionFactory connectionFactory;

    public RedisAccessor() {
    }

    public void afterPropertiesSet() {
        Assert.state(this.getConnectionFactory() != null, "RedisConnectionFactory is required");
    }
}
public interface InitializingBean {
    void afterPropertiesSet() throws Exception;
}

InitializingBean接口有个,afterPropertiesSet()方法这个方法的意思是初始化bean的时候执行

RedisAccessor 实现了InitializingBean接口,实现了afterPropertiesSet()方法,RedisTemplate又继承了RedisAccessor ,重写了afterPropertiesSet()方法,且序列化的配置都在这个方法中,意味着,在将RedisTemplate对象交给SpringIOC容器管理的时候就有了默认的jdk序列化能力,如果要自定义设置序列化方式,就需要创建一个配置类,然后创建一个RedisTemplate对象,然后设置自定义的key,value的序列方式, 和连接工厂对象, 最后把对象方到SpringIOC容器中,这样以后使用RedisTemplate创建redis对象时就是用的自定义的序列化方式.

@Configuration
public class RedisConfiguration {
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        //设置redis key的序列化对象
        template.setKeySerializer(new StringRedisSerializer());
        //设置redis连接工厂对象
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值