![](https://img.haomeiwen.com/i12244945/4fc3e5fbc0d55fdd.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 对比
![](https://img.haomeiwen.com/i12244945/523e925a1b314d77.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()
![](https://img.haomeiwen.com/i12244945/c4eda900f815210f.png)
网友评论