場景
先說下場景: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