10.8. Serializers
译文
从框架的角度来看,Redis中存储的数据只是字节。
虽然Redis本身支持多种类型,但在大多数情况下,这些类型指的是数据存储的方式,而不是它所代表的内容。
由用户决定是将信息转换为字符串还是任何其他对象。
在Spring Data中,用户(自定义)类型和原始数据(反之亦然)之间的转换是在org.springframework.data.redis.serializer包中处理的。
这个包包含两种类型的序列化器,顾名思义,它们负责序列化过程:
基于RedisSerializer的双向序列化器。
使用RedisElementReader和RedisElementWriter的元素读取器和写入器。
这些变体之间的主要区别是RedisSerializer主要序列化为byte[],而读取器和写入器使用ByteBuffer。
有多种实现(包括本文档中已经提到的两种):
JdkSerializationRedisSerializer,默认情况下用于RedisCache和RedisTemplate。
StringRedisSerializer。
然而,我们可以使用OxmSerializer通过Spring OXM支持进行对象/XML映射,或者使用Jackson2JsonRedisSerializer或GenericJackson2JsonRedisSerializer以JSON格式存储数据。
实践
package com.cjh.example;
import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class Config {
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(redisConnectionFactory);
stringRedisTemplate.setKeySerializer(new StringRedisSerializer());
stringRedisTemplate.setValueSerializer(new GenericToStringSerializer<>(Object.class));
return stringRedisTemplate;
}
@Bean
public RedisTemplate redisTemplate(RedisTemplate springbootRedisTemplate) {
RedisTemplate redisTemplate = springbootRedisTemplate;
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
return redisTemplate;
}
}
GenericFastJsonRedisSerializer序列化
GenericToStringSerializer序列化
源码
StringRedisTemplate 序列化
RedisTemplate 序列化