两种Redis序列化对比
两种Redis序列化方案对比
方案一:自定义RedisTemplate(自动序列化)
特点:配置一次,自动处理序列化
// SpringDataRedis3ApplicationTests.java
@SpringBootTest
class SpringDataRedis3ApplicationTests {@Autowired RedisTemplate<String, Object> redisTemplate; // 使用自定义配置的RedisTemplate@Testvoid testSaveUser(){// 直接存储对象,自动序列化redisTemplate.opsForValue().set("user:100", new User("彪哥", 18));// 直接获取对象,自动反序列化User user = (User) redisTemplate.opsForValue().get("user:100");System.out.println("user: " + user);}
}配置:需要RedisConfig配置类
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);// 配置序列化器template.setKeySerializer(RedisSerializer.string());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());template.afterPropertiesSet();return template;}
}方案二:StringRedisTemplate(手动序列化)
特点:手动控制序列化过程
// RedisStringTest.java
@SpringBootTest
class RedisStringTest {@Autowiredprivate StringRedisTemplate stringRedisTemplate; // 使用StringRedisTemplateprivate static final ObjectMapper mapper = new ObjectMapper();@Testvoid testSaveUser() throws JsonProcessingException {// 1. 创建对象User user = new User("彪爷", 18);// 2. 手动序列化为JSONString json = mapper.writeValueAsString(user);// 3. 存储JSON字符串stringRedisTemplate.opsForValue().set("user:200", json);// 4. 获取JSON字符串String jsonUser = stringRedisTemplate.opsForValue().get("user:200");// 5. 手动反序列化为对象User user1 = mapper.readValue(jsonUser, User.class);System.out.println("user1: " + user1);}
}两种方案对比
| 方面 | 方案一(RedisTemplate) | 方案二(StringRedisTemplate) |
|---|---|---|
| 配置复杂度 | 需要自定义配置类 | 无需配置,开箱即用 |
| 使用复杂度 | 简单,直接存储对象 | 复杂,需要手动序列化 |
| 代码量 | 少 | 多 |
| 灵活性 | 低,序列化方式固定 | 高,可以自定义序列化逻辑 |
| 性能 | 稍好(自动优化) | 稍差(手动处理) |
| 调试 | 难(自动序列化) | 易(可见JSON) |


当项目所需序列化极多的时候,就需要手动配置一些序列化避免浪费内存,如上图自动序列化反序列化的过程需要@class:路径来判断反序列化的类型,如果极多的情况下就会极大地浪费内存
