在redis里输入指令monitor
,再重新执行下这段代码,看到 redis 上打印以下内容
代码执行的命令是
exists serialId
get serialId
但实际上却是
exists \xac\xed\x00\x05t\x00\bserialId
get \xac\xed\x00\x05t\x00\bserialId
这两个命令,那当然获取不到值啦,可这是为什么呢?
原因就是没有对 redisTemplate 进行序列化处理,java 代码会将 key 转化成对应的十六进制的数值进行操作
@Configuration
@EnableCaching //开启注解
public class RedisConfig extends CachingConfigurerSupport {
/**
* retemplate相关配置
* 序列化配置,如果没有配置序列化的话可能会出现往redis存了值,但是获取不到
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSeial.setObjectMapper(om);
template.setValueSerializer(jacksonSeial);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(jacksonSeial);
template.afterPropertiesSet();
return template;
}
}
添加序列化的配置重启服务,执行,控制台上看到能正确获取到值了