1:ERR value is not an integer or out of range
1-1:背景
使用redisTemplate.opsForValue().increment(key, delat)方法。
1-2:分析
分析:redis對任何不合法的值,都稱為ERR。只有使用StringRedisSerializer序列化器才能使用incrment或者decrement方法
1-3:問題解決
使用GenericToStringSerializer、StringRedisSerializer序列化器,都可以使用increment方法.
1-4:建議
建議redis key序列化使用StringRedisSerializer,redis value序列化使用Jackson2JsonRedisSerializer。
1-5:代碼示例
/** * key redis serializer: {@link StringRedisSerializer} and * key redis serializer: {@link Jackson2JsonRedisSerializer} **/ @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); Jackson2JsonRedisSerializer valueRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //設置Redis的value為json格式,並存儲對象信息的序列化類型 ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); valueRedisSerializer.setObjectMapper(objectMapper); RedisSerializer keyRedisSerializer = new StringRedisSerializer(); template.setKeySerializer(keyRedisSerializer); template.setValueSerializer(valueRedisSerializer); template.setHashKeySerializer(keyRedisSerializer); template.setHashValueSerializer(valueRedisSerializer); template.setConnectionFactory(factory); template.afterPropertiesSet(); return template; }
2:key前面會有一堆\xac\xed\x00\x05t\x00\tb
2-1:分析
分析spring-data的org.springframework.data.redis.core.RedisTemplate源代碼以后發現。SpringBoot默認采用defaultSerializer = new JdkSerializationRedisSerializer();來對key,value進行序列化操作,在經過查看JdkSerializationRedisSerializer中對序列化的一系列操作,即默認使用。由於spring操作redis是在jedis客戶端基礎上進行的,而jedis客戶端與redis交互的時候協議中定義是用byte類型交互,jedis中提供了string類型轉為byte[]類型。原因其實就出現在這里,解決的辦法就是手動定義序列化的方法。
從SpringBoot data redis中RedisTemplate源碼可以看出,默認的key/value序列化類是JdkSerializationRedisSerializer。所以會造成持久化時,出現16進制編碼的數據。
2-2:解決
使用上面的代碼示例即可。key序列化類使用StringRedisSerializer,value序列化類使用Jackson2JsonRedisSerializer即可,采用JSON存儲value即可。