在Spring Data Redis中,RedisTemplate 是操作Redis的核心类,它提供了丰富的API来与Redis进行交互。由于Redis是一个键值存储系统,它存储的是字节序列,因此在使用RedisTemplate时,需要指定键(Key)和值(Value)的序列化方式。不同的序列化方式适用于不同的场景。下面将详细介绍几种序列化方法。
序列化如下对象
User 类
public class User implements Serializable {
String name;
String ID;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", ID='" + ID + '\'' +
'}';
}
public User(String name, String ID) {
this.name = name;
this.ID = ID;
}
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
}
JdkSerializationRedisSerializer
JdkSerializationRedisSerializer
是使用JDK自带的序列化机制(ObjectOutputStream 和 ObjectInputStream
)来序列化和反序列化POJO对象。这种序列化方式会将对象转换成字节序列,并存储在Redis中。这是RedisTemplate中默认的序列化策略之一(但通常不是推荐用于生产环境的默认策略,因为JDK序列化通常效率较低且生成的字节序列较大)。最大的缺点就是:要求序列化的对象要求继承Serializable
类,这是DTO无法容忍的一个要求。
优点:
- 与其他两个比几乎没有优点,超级不推荐!
缺点:
- 二进制形式存储,不利于查看!94 bytes
- 序列化生成的字节序列较大,导致网络传输和存储成本较高。
- 序列化速度慢。
- 序列化的字节序列是私有的,不便于跨语言或跨平台共享。
代码示例
@Test
public void test4(){
User user = new User("李白","123456");
// GenericToStringSerializer<Object> genericToStringSerializer = new GenericToStringSerializer<>(Object.class);
// redisTemplate.setKeySerializer(genericToStringSerializer);
// JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
// redisTemplate.setValueSerializer(jdkSerializationRedisSerializer);
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setValueSerializer(RedisSerializer.java());
// 记录开始时间
Instant start = Instant.now();
redisTemplate.opsForValue().set("test4",user);
User user2 = (User)redisTemplate.opsForValue().get("test4")