解决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

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