对于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,完美收工。 ☺