我们知道系统中的RedisTemplate默认采用的是JDK的序列化机制,假如我们不希望使用默认的JDK方式序列化,可以对RedisTemplate对象进行定制,指定自己的序列化方式,例如:
参悟序列化高级制定
目录
1-简单定制RedisTemplate对象
Pojo对象
package com.jt.Pojo;
import lombok.Data;
import java.io.Serializable;
@Data
public class Pojo implements Serializable {
private static final long serialVersionUID = 8397600816070129636L;
private Long id;
private String title;
private String content;
private String remark;
}
config对Bean配置
package com.jt.config;
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.RedisSerializer;
@Configuration
public class RedisConfig {
/**
* 基于业务定制RedisTemplate对象
* @param connectionFactory
* @return
*/
@Bean
public RedisTemplate<Object, Object> simpleRedisTemplate(
RedisConnectionFactory connectionFactory){
RedisTemplate<Object, Object> redisTemplate=
new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
//设置序列化方式
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
redisTemplate.setHashValueSerializer(RedisSerializer.string());
//redisTemplate.setValueSerializer(RedisSerializer.java());
redisTemplate.setValueSerializer(RedisSerializer.json());
return redisTemplate;
}//参考renren.io源代码
}
Test测试简单制定效果
package com.jt;
import com.jt.Pojo.Pojo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
@SpringBootTest
public class RedisConfigTests {
@Autowired
private RedisTemplate simpleRedisTemplate;
@Test
void testBlogOper1(){
Pojo pojo = new Pojo();
pojo.setId(100L);
pojo.setContent("Terad=sin");
pojo.setTitle("COnHash");
ValueOperations valueOperations = simpleRedisTemplate.opsForValue();
valueOperations.set("S25",pojo );
Object s25 = valueOperations.get("S25");
System.out.println("Object 型:"+s25);
//自定义 序列化 JSON
Pojo pojo1=(Pojo) valueOperations.get("S25");
System.out.println("Pojo对象 :"+pojo1);
}
}
2-高级定制RedisTemplate对象
Pojo对象
package com.jt.Pojo;
import lombok.Data;
import java.io.Serializable;
@Data
public class Pojo implements Serializable {
private static final long serialVersionUID = 8397600816070129636L;
private Long id;
private String title;
private String content;
private String remark;
}
config对Bean配置
package com.jt.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
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.RedisSerializer;
import org.springframework.stereotype.Component;
@Configuration
public class RedisConfig {
/**
* 基于业务定制RedisTemplate对象
* @param connectionFactory
* @return
*/
public RedisSerializer<?> redisSerializer(){
//1.定义序列化对象,并指定可以对哪些类型对象进行序列化
Jackson2JsonRedisSerializer serializer=
new Jackson2JsonRedisSerializer(Object.class);
//2.构建对象映射对象(将对象转换为json或者将json转换对象)
ObjectMapper objectMapper=new ObjectMapper();
//2.1设置序列化时的可见方法
objectMapper.setVisibility(PropertyAccessor.GETTER,//序列化时只调用get方法
JsonAutoDetect.Visibility.ANY);//get方法的访问修饰符可以任意
//2.2序列化时值的规则定义(例如值为null还是否要序列化)
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//2.3激活类型存储(这个一般在反序列化时有用,否则反序列化时数据默认存储在LinkedHashMap中)
objectMapper.activateDefaultTyping(
objectMapper.getPolymorphicTypeValidator(),//开启多态校验
ObjectMapper.DefaultTyping.NON_FINAL,//序列化的来不能使用final修饰
JsonTypeInfo.As.PROPERTY);//将类型以属性形式存储到json串中
//2.4设置对象映射对象
serializer.setObjectMapper(objectMapper);
return serializer;
}
@Bean
public RedisTemplate<Object, Object> redisTemplate(
RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> redisTemplate =
new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
//设置序列化方式
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
redisTemplate.setHashValueSerializer(redisSerializer());
redisTemplate.setValueSerializer(redisSerializer());
//建议更新了序列化方式后,执行一下如下方法
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
Test测试高级制定效果
package com.jt;
import com.jt.Pojo.Pojo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
@SpringBootTest
public class RedisConfigTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void testBlogOper2(){
Pojo blog1=new Pojo();
blog1.setId(100L);
blog1.setTitle("Title-AA");
blog1.setContent("Content-AAA");
blog1.setRemark("Remark-AAA");
ValueOperations valueOperations =
redisTemplate.opsForValue();
valueOperations.set("blog:100", blog1);
Pojo blog2=(Pojo)valueOperations.get("blog:100");
System.out.println(blog2);
}
}