serialization
spring-data-redis 不配置序列化默认使用的是jdk自带的序列化 其产生的 Key/Value 不可读(乱码) 、占用空间大且兼容性差(Java 对象的类型元数据)
什么是序列化?
序列化是将对象转换成字节流的过程,反序列化则是相反的过程。
由于 Redis 是一个键值存储系统,它存储的所有数据(包括键 Key 和值 Value)最终都是字节数组(byte[])。
因此,当您使用 RedisTemplate 将 Java 对象存入 Redis 时,就需要一个序列化器(Serializer)来完成这个转换工作。
Spring Data Redis 的核心序列化接口
在 Spring Data Redis 中,核心的序列化接口是 RedisSerializer<T>,它定义了两个主要方法:
byte[] serialize(T t): 将对象t序列化为字节数组。T deserialize(byte[] bytes): 将字节数组反序列化为对象T。
RedisTemplate 默认使用 JdkSerializationRedisSerializer 进行序列化。
✨ 常见的序列化器
- StringRedisSerializer: 序列化为字符串
- GenericJackson2JsonRedisSerializer: 序列化为json
提示: 实际项目中,Key 通常配置为
StringRedisSerializer以保证可读性, 而 Value 则常选择GenericJackson2JsonRedisSerializer或Jackson2JsonRedisSerializer来存储复杂对象。
自定义序列化方式
@Configuration
public class RedisConfiguration {
@Bean
RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory
connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(RedisSerializer.string());
template.setValueSerializer(jsonSerializer);
template.setHashKeySerializer(RedisSerializer.string());
template.setHashValueSerializer(jsonSerializer);
return template;
}
}
StringRedisTemplate
用来简化和优化在 Spring 应用程序中操作 Redis 时的字符串类型数据, 使用GenericJackson2JsonRedisSerializer默认存储的json会存储类的类型,额外占用空间:
{
"@class": "com.jasper.springdataredisdemo.pojo.User",
"id": "1",
"name": "jasper"
}
可以使用stringRedisTemplate 手动序列化对象,然后存入redis
void testObject() throws JsonProcessingException {
User user = new User("2", "cliff");
String json = mapper.writeValueAsString(user);
stringRedisTemplate.opsForValue().set("user:2", json);
String jsonUser = stringRedisTemplate.opsForValue().get("user:2");
User resultUser = mapper.readValue(jsonUser, User.class);
System.out.println("resultUser = " + resultUser);
}