解決Redis K和v 亂碼情況 插入整個對象

場景

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章