StringRedisTemplate, RedisTempla

2021-02-23  本文已影响0人  蓉漂里的小白
image.png
RedisSerializer是序列化的接口,StringRedisSerializer, JdkSerializationRedisSerializer是二个实现类,
StringRedisSerializer:
会把写到redis里面的数据序列化成字符串,默认是UTF_8编码
JdkSerializationRedisSerializer:
JdkSerializationRedisSerializer类内有一个Converter<Object, byte[]> serializer的成员变量,主要作用就是序列化写入redis中的数据。默认值是一个SerializingConverter(Convert的方法很简单就是把要写入redis的数据序列化成一个byte数组)。下面是SerializingConverter的convert方法源码
public byte[] convert(Object source) {
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream(1024);

    try {
        this.serializer.serialize(source, byteStream);
        return byteStream.toByteArray();
    } catch (Throwable var4) {
        throw new SerializationFailedException("Failed to serialize object using " + this.serializer.getClass().getSimpleName(), var4);
    }
}

StringRedisSerializer, JdkSerializationRedisSerializer 对比

image.png

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;
        }
    }
    this.initialized = true;
}

afterPropertiesSet方法是spring 在实例化bean时候调用的初始化方法,RedisTemplate的这个方法逻辑很简单就是给defaultSerializer创建一个JdkSerializationRedisSerializer类,然后将这个默认的序列化类依次赋值给keySerializer,valueSerializer,hashKeySerializer,hashValueSerializer

StringRedisTemplate 部分源码

public class StringRedisTemplate extends RedisTemplate<String, String> {
public StringRedisTemplate() {
    this.setKeySerializer(RedisSerializer.string());
    this.setValueSerializer(RedisSerializer.string());
    this.setHashKeySerializer(RedisSerializer.string());
    this.setHashValueSerializer(RedisSerializer.string());
}

StringRedisTemplate是Redistemplate的子类,而且构造函数中调用的this.setkeySerializer, this.set valueSerializer, this.sethashKeySerializer, this.sethashValueSerializer都是父类Redistemplate的方法
StringRedisTemplate的构造函数方法很简单就是对keySerializer,valueSerializer,hashKeySerializer,hashValueSerializer设置序列化方式为Redis.Serializer.string()


image.png

\color{red}{ 使用StringRedisTemplate写入的数据只能通过StringRedisTemplate来读取}
\color{red}{使用RedisTemplate写入的数据也只能通过RedisTemplate来读取}
\color{red}{原因就是他们写入和解析数据的序列化方式不一样}

上一篇 下一篇

猜你喜欢

热点阅读