redistemplate修改value值_RedisTemplate和StringRedisTemplate的区别

一.简介

简单的说,RedisTemplateStringRedisTemplate的关系如下:

1.StringRedisTemplateRedisTemplate的子类。

2.StringRedisTemplate的各个序列化策略都是StringRedisSerializer,而RedisTemplate用的是JdkSerializationRedisSerializer

二.RedisTemplate和StringRedisTemplate的代码结构

RedisTemplate类说起。

RedisTemplate类中,定义了这样四个变量:

@Nullable
private RedisSerializer keySerializer = null;
@Nullable
private RedisSerializer valueSerializer = null;
@Nullable
private RedisSerializer hashKeySerializer = null;
@Nullable
private RedisSerializer hashValueSerializer = null;

分别代表了普通keyvalue,和Hash类型的key,value的序列化策略,可以分别设置。

另外定义变量,用来指定默认的序列化策略:

@Nullable
private RedisSerializer> defaultSerializer;

RedisTemplate类中,定义了afterPropertiesSet()方法,当Spring创建RedisTemplate类的对象时,会调用这个方法:

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;
        }
    }

    if (this.enableDefaultSerializer && defaultUsed) {
        Assert.notNull(this.defaultSerializer, "default serializer null and not all serializers initialized");
    }

    if (this.scriptExecutor == null) {
        this.scriptExecutor = new DefaultScriptExecutor(this);
    }

    this.initialized = true;
}

可以看到,在默认情况下,RedisTemplate使用的默认序列化策略是JdkSerializationRedisSerializer。包括RedisTemplate下的keyvaluehash-key,hash-value的序列化,都用这种策略。

再来看看StringRedisTemplate,他作为RedisTemplate的子类,只是修改了序列化策略:

public class StringRedisTemplate extends RedisTemplate<String, String> {
     
    public StringRedisTemplate() {
        RedisSerializer stringSerializer = new StringRedisSerializer();this.setKeySerializer(stringSerializer);this.setValueSerializer(stringSerializer);this.setHashKeySerializer(stringSerializer);this.setHashValueSerializer(stringSerializer);
    }public StringRedisTemplate(RedisConnectionFactory connectionFactory) { this();this.setConnectionFactory(connectionFactory);this.afterPropertiesSet();
    }protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) { return new DefaultStringRedisConnection(connection);
    }
}

以上就是StringRedisTemplate整个类的内容,可以看到,在他的默认构造中,keyvaluehash-keyhash-value都使用的是StringRedisSerializer类作为序列化策略。这也就是StringRedisTemplate和他的父类RedisTemplate的主要区别。

三.序列化策略

更进一步,看一下这个序列化策略是什么。

上面提到的StringRedisSerializerJdkSerializationRedisSerializer都是序列化策略类,他们都实现了一个RedisSerializer接口:

public interface RedisSerializer<T> {
     
    @Nullable
    byte[] serialize(@Nullable T var1) throws SerializationException;

    @Nullable
    T deserialize(@Nullable byte[] var1) throws SerializationException;
}

接口表达的意思很简单,两个方法,serialize用于序列化,把对象变为byte数组,deserialize用于反序列化,把byte数组转为对象。

StringRedisSerializer

看看StringRedisSerializer是怎么做的:

1.StringRedisSerializer的构造:

public StringRedisSerializer() {
     
    this(StandardCharsets.UTF_8);
}

public StringRedisSerializer(Charset charset) {
    Assert.notNull(charset, "Charset must not be null!");
    this.charset = charset;
}

定义了编码格式,默认UTF_8

2.StringRedisSerializer的serialize和deserialize方法:

public String deserialize(@Nullable byte[] bytes) {
     
    return bytes 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值