✨✨个人主页:沫洺的主页
📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏
📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专栏
📖Docker专栏📖Reids专栏📖MQ专栏📖SpringCloud专栏
💖💖如果文章对你有所帮助请留下三连✨✨
RedisTemplate
与StringRedisTemplate底层对象是同一个
RedisTemplate
既然是泛型就可以指定类型,通常K为String,V为对象或其他类型
User类(可序列化)
@Data @AllArgsConstructor @NoArgsConstructor @Builder public class User implements Serializable { private String name; private int age; }@Autowired 与 @Resource 区别
- @Autowired注解由Spring提供,只按照byType注入;
- @Resource注解由J2EE提供,默认按照byName自动注入,按照名字如果找不到,再按照类型byType去找
- @Autowired默认按类型进行装配,
- @Resource默认按照名称进行装配。
//@Autowired 按类型找不到会报错,找不到bean //@Resource 按名称redisTemplate找,若找不到按照类型也找不到则报错 @Resource(name = "redisTemplate")//不设置name默认安装方法名找 private RedisTemplateredisTemplate; 因此使用@Resource(name = "redisTemplate")来注入bean
@Resource(name = "redisTemplate") private RedisTemplateredisTemplate; @Test public void test1(){ User user1 = User.builder().name("张三").age(23).build(); //会出现乱码问题 redisTemplate.opsForValue().set("user1", user1); //可以正常获取 User user = redisTemplate.opsForValue().get("user1"); System.out.println(user); }乱码问题分析
StringRedisTemplate不会乱码是因为底层使用的是StringRedisSerializer序列化工具
RedisTemplate
具体原因就是出在JdkSerializationRedisSerializer上
解决乱码问题
自定义RedisConfig
@Configuration public class RedisConfig { @Bean public RedisTemplate RedisTemplate template.setConnectionFactory(redisConnectionFactory); //配置序列化工具 //json序列化工具 对象使用此序列化 Jackson2JsonRedisSerializer jsonSerializer = new Jackson2JsonRedisSerializer(Object.class); //类型转换 ObjectMapper objectMapper = new ObjectMapper(); //设置所有属性可见性序列化 objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); //默认键入全包名 objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jsonSerializer.setObjectMapper(objectMapper); //string序列化工具 string使用此序列化 StringRedisSerializer stringSerializer = new StringRedisSerializer(); //设置KEY/key的序列化工具为stringSerializer template.setKeySerializer(stringSerializer); //设置值的序列化工具为jsonSerializer template.setValueSerializer(jsonSerializer); //设置hash的小key的序列化工具为stringSerializer template.setHashKeySerializer(stringSerializer); //设置hash的值的序列化工具为jsonSerializer template.setHashValueSerializer(jsonSerializer); template.afterPropertiesSet(); return template; } }对象使用json序列化工具Jackson2JsonRedisSerializer
String还是使用StringRedisSerializer序列化工具
之所以我们自定义的RedisTemplate
@ConditionalOnMissingBean( name = {"redisTemplate"})
解决乱码问题后再执行test1