java对象传入Redis序列化问题

当使用RedisTemlete向Redis存储java对象时(Object对象),系统会将传输的java对象转化为Redis可以处理的字节,如图所示

 此时需要使用RedisSerializer进行序列化和反序列化

代码如下

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory){
        //创建RedisTemp对象
        RedisTemplate template = new RedisTemplate<>();
        //设置连接工厂
        template.setConnectionFactory(connectionFactory);
        //创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //设置key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        //设置value的序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
//        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        //返回
        return template;
    }

测试存储对象

java对象传入Redis序列化问题_第1张图片

 此时Redis中存储的结果为

当写入json的同时还写入了User类的字节码,正是因为有这才能反序列化为对应的User,但是会发现类的字节码占用的空间比数据本身占用的空间还要多,会带来额外的开销,如果是大型的项目数百万的对象需要存储此时就不能使用、

为了节省空间不会使用Json序列化器来处理value,而是使用String序列化器StringReidsTemplate,要求只能存储String类型的key和value,当需要存储java对象时,需要手动完成序列化与反序列化,Spring配置了StringRedisTemplate,无需再手动配置直接使用即可

 代码如下

@SpringBootTest
class RedisStringTests {
    @Autowired
    private StringRedisTemplate stringredisTemplate;

    @Test
    void contextLoads() {
        //写入一条String数据
        stringredisTemplate.opsForValue().set("name3","kangning1");
        //获取String数据
        Object name = stringredisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);

    }
    private static final ObjectMapper mapper=new ObjectMapper();
    @Test
    void testSaveUser() throws JsonProcessingException {
        //创建对象
        User user=new User("康宁",21);
        //手动序列化
        String json = mapper.writeValueAsString(user);
        //写入数据
        stringredisTemplate.opsForValue().set("user:200",json);
        //获取数据
        String jsonUser = stringredisTemplate.opsForValue().get("user:200");
        //手动反序列化
        User user1 = mapper.readValue(jsonUser, User.class);

        System.out.println("user1 = " + user1);
    }
  

}

 

你可能感兴趣的:(redis,java)