背景:使用redisTemplate存取数据时,在rdm中发现key和value都是乱码\xAC\xED\x00\x05t\x00\x04
redisTemplate.opsForValue().set("name", "虎哥");
Object name = redisTemplate.opsForValue().get("name");
原因:spring-data-redis的RedisTemplate在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化,JdkSerializationRedisSerializer是存储二进制字节码
解决方案:
1.设置key和value的序列化规则
//设置key和value的序列化规则
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.opsForValue().set("name", "虎哥");
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name=" + name);
2.使用stringRedisTemplate
stringRedisTemplate.opsForValue().set("sex","男");
Object sex =stringRedisTemplate.opsForValue().get("sex");
System.out.println("sex=" + sex);
3.编写自动序列化的工具类
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
//创建RedisTemplate对象
RedisTemplate<String,Object> template = new RedisTemplate<String,Object>();
//设置连接工厂
template.setConnectionFactory(connectionFactory);
//创建json序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//设置key的序列化
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
//设置value的序列化
template.setValueSerializer(jsonRedisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
//返回
return template;
}
}
@SpringBootTest
class SpringDataRedisDemoApplicationTests {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@Test
void contextLoads() {
redisTemplate.opsForValue().set("name", "胡歌");
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name=" + name);
stringRedisTemplate.opsForValue().set("sex","男");
Object sex =stringRedisTemplate.opsForValue().get("sex");
System.out.println("sex=" + sex);
}
}