【Redis】Redis自动序列化和手动序列化的区别(存储结构、内存开销,实际写法)

对于Redis有两种序列化和反序列化的方式,

方式一:
一种是通过 注入RedisTemplate 对象,找个对象,通过配置类进行一定的配置,使得使用RedisTemplate 对象时,便会使用配置的那些键、值的序列化方式:
@Autowired
private RedisTemplate redisTemplate;
例子:
首先写一个RedisTemplate 配置类
RedisConfig.java

package com.atguigu.gulimall.providerconsumer.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 *  此配置类可以公用,在实际开发过程中可以拿来直接使用
 * 使用 @Configuration 注解将 RedisConfig 类定义为配置类,使用 @Bean 注解将 redisTemplate 方法注册为 Bean 对象。
 * redis配置类
 * @author: jd
 * @create: 2024-07-05
 */

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String,Object> redisTemplate (RedisConnectionFactory factory){
        // 我们为了自己开发方便,一般直接使用 <String, Object>
        RedisTemplate<String, Object> stringObjectRedisTemplate = new RedisTemplate<>();
        stringObjectRedisTemplate.setConnectionFactory(factory);
        //value的 Json序列化配置
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // String 的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        stringObjectRedisTemplate.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        stringObjectRedisTemplate.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        stringObjectRedisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        stringObjectRedisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        stringObjectRedisTemplate.afterPropertiesSet();
        return stringObjectRedisTemplate;
    }

}

测试接口:
TestController.java


  @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 使用自定义的redisTemplate配置实现存储时的自动序列化、反序列化
     * https://blog.csdn.net/weixin_43829443/article/details/112913032
     * 测试redis使用
     * @return
     */
    @PostMapping("/testRedis")
    public ServerResponse testRedis(){
        User user = new User();
        user.setName("dingdada");
        user.setAge(23);
        user.setHigh(172);
        redisTemplate.opsForValue().set("user",user);
        System.out.println(redisTemplate.opsForValue().get("user"));
        return ServerResponse.success(ResponseCode.SUCCESS.getMsg());

    }

测试如下;
在这里插入图片描述

在这里插入图片描述
这是一个 JSON 形式的数据,@class 存放的值为序列化的对象的类的信息,这个信息是用于在反序列化的时候可以知道对象的类型,但是也带来了额外的内存开销。
在这里插入图片描述

方式二:使用 StringRedisTemplate 进行序列化

为了节省内存空间,通常并不会使用 JSON 序列化器来处理 value,而是统一使用 String 序列化器,要求只能存储 String 类型的 key 和 value,当需要存储 Java 对象时,手动完成对象的序列化和反序列化。

Spring 默认提供了一个 StringRedisTemplate 类,它的 key 和 value 的序列化方式默认就是 String 方式。省去了自定义 RedisTemplate 的过程。

首先,注入 StringRedisTemplate 类
对于存储 String 类型的数据,SpringRedisTempalte 默认帮我们实现了存储前的序列化以及取出前的反序列化。

在这里插入图片描述

对于存储对象类型,则需要我们手动序列化和手动反序列化
在这里插入图片描述

存储后,成功取出:
在这里插入图片描述

在这里插入图片描述
OK,完美收工。 ☺

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执键行天涯

码你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值