在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; } }
添加序列化的配置重启服务,执行,控制台上看到能正确获取到值了