场景
先说下场景:springboot整理redis,我是直接注入redisTemplate来进行操作redis.
其实出现这种情况,一般都知道,没有序列化
思路:
点到源码进去看的时候发现
RedisTemplate选择了默认的序列化器JdkSerializationRedisSerializer
- 官方文档是这样说的:
RedisTemplate (Spring Data Redis 2.1.4.RELEASE API)
Performs automatic serialization/deserialization between the given objects and
the underlying binary data in the Redis store. By default, it uses Java serialization
for its objects (through JdkSerializationRedisSerializer ).
For String intensive operations consider the dedicated StringRedisTemplate
而源码里面提供的是:
StringRedisTemplate.java
RedisSerializer.java
- StringRedisTemplate默认选择的StringRedisSerializer序列化器
由于我上面测试的是object,所以会导致没序列化乱码 - 配置序列化
@Configuration
public class RedisConfig{
@Bean
public RedisTemplate<String,Object>redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object>template=new RedisTemplate<>();
//关联
template.setConnectionFactory(factory);
//设置key的序列化器
template.setKeySerializer(new StringRedisSerializer());
//设置value的序列化器
template.setValueSerializer(new StringRedisSerializer());
return template;
}
}
这里可以提一嘴:为什么要序列化?
其实在java语言里面,一切皆为对象,而将对象的状态信息转为存储或传输的形式需要序列化。
/**
* @Classname RedisConfig
* @Description Rredis 配置类
* @Date 2020/5/21 11:38
* @Created by corey
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String ,Object> template = new RedisTemplate<>();
//关联
template.setConnectionFactory(factory);
//设置key的序列化
template.setKeySerializer(new StringRedisSerializer());
//设置key的序列化
template.setValueSerializer(new Jackson2JsonRedisSerializer<>(User.class));
return template;
}
}
在实际开发中很多情况下都是采用这种情况,实际情况下可能有多种需求,泛型不同,比如 <String,User>,直接配在config里面加一个方法就行
- 下面是我完整的例子
首先引入依赖;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
yml中添加redis的配置
1.实体类为User,一定要实现序列化
@Data
public class Days implements Serializable {
private String openId;
private String daysId;
//每天的标题
private String title;
//代办事项的数量
private int itemNumber;
//日程
private String date;
}
2.然后在配置类中设置序列化器
/**
* @Classname RedisConfig
* @Description Rredis 配置类
* @Date 2020/5/21 11:38
* @Created by corey
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String ,Object> template = new RedisTemplate<>();
//关联
template.setConnectionFactory(factory);
//设置key的序列化
template.setKeySerializer(new StringRedisSerializer());
//设置key的序列化
template.setValueSerializer(new Jackson2JsonRedisSerializer<>(User.class));
return template;
}
}
3.测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloworldApplicationTests {
@Resource
private RedisTemplate<String,User> redisTemplate;
@Test
public void testUser(){
User user = new User();
user.setDate("123");
user.setDaysId("456");
user.setItemNumber(123);
user.setOpenId("dawda");
user.setTitle("title");
this.redisTemplate.opsForValue().set("corey",user);
System.out.println((redisTemplate.opsForValue().get("corey")));
}
4.运行测试结果直接查看
可以发现存储的k/v都没有乱码,而且对象信息也在里面
参考:
https://blog.csdn.net/qq_36781505/article/details/86612988