需求:在Springboot2框架中使用redis,并且存入的key-value序列化
如果没有设置直接存入中文字符则会显示十六进制的“编码”
测试类(使用默认的redis中的jdkSerializationRedisSerialliszer 序列化)
@SpringBootTest
class ApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set("school", "红棉小学");
Object school = valueOperations.get("school");
System.out.println("school:"+school);
}
可看到一下图片中key和value都是十六制的乱码,那怎么变成自己想要的字符呢,因此需要使用自己定义的序列化,而不是默认的序列化
解决方案
新建一个配置类
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
//创建RedisTemplate对象
RedisTemplate<String, Object> template = new RedisTemplate<>();
//设置连接工厂
template.setConnectionFactory(redisConnectionFactory);
//设置Json序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//设置Key序列化
template.setKeySerializer(RedisSerializer.string());
//设置Value序列化
template.setHashValueSerializer(jsonRedisSerializer);
//设置HashKey序列化
template.setHashKeySerializer(RedisSerializer.string());
//设置HashValue序列化
template.setHashValueSerializer(jsonRedisSerializer);
//必须设置,因为看源码可知,只有设置了jsonRedisSerializer,才不会采用默认的jdkSerializationRedisSerialliszer
template.setDefaultSerializer(jsonRedisSerializer);
template.afterPropertiesSet();
//返回
return template;
}
}
这里需要注意的细节:
template.setDefaultSerializer(jsonRedisSerializer);
template.afterPropertiesSet();
不要忘记设置(某培训机构没有设置)
修改测试类
得到想要的结果
同样扩展values存放的是对象也是
创建一个实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private String name;
private Integer age;
}
创建测试类
@Test
void testSaveUser(){
redisTemplate.opsForValue().set("user:100", new User("虎哥",21));
User o = (User) redisTemplate.opsForValue().get("user:100");
System.out.println(o);
}
得到结果如上,成功的存放想要对象序列化成json格式