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:問題解決:
- GenericJackson2JsonRedisSerializer、Jackson2JsonRedisSerializer是先將對象轉爲json,然後再保存到redis,所以,1在redis中是字符串1,所以無法進行加1
- JdkSerializationRedisSerializer使用的jdk對象序列化,序列化後的值有類信息、版本號等,所以是一個包含很多字母的字符串,所以根本無法加1,這個序列化器跟memcache的序列化規則很像memcache怎樣存儲的對象
- GenericToStringSerializer、StringRedisSerializer將字符串的值直接轉爲字節數組,所以保存到redis中是數字,所以可以進行加1
1-4:總結:
使用GenericToStringSerializer、StringRedisSerializer序列化器,都可以使用increment方法.
1-5:建議redis key序列化使用StringRedisSerializer,redis value序列化使用Jackson2JsonRedisSerializer。
/**
* key redis serializer: {@link StringRedisSerializer} and
* key redis serializer: {@link Jackson2JsonRedisSerializer}
**/
@Bean(name = "genericRedisTemplate")
public RedisTemplate<String, String> redisTemplate3(RedisConnectionFactory factory) {
RedisTemplate<String, String> template = new RedisTemplate<>();
RedisSerializer valueRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
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
1-1:背景:使用SpringData對redis進行操作
1-2:分析
分析spring-data的org.springframework.data.redis.core.RedisTemplate源代碼以後發現.Spring默認採用defaultSerializer = new JdkSerializationRedisSerializer();**來對key,value進行序列化操作,在經過查看JdkSerializationRedisSerializer中對序列化的一系列操作,即默認使用。**由於spring操作redis是在jedis客戶端基礎上進行的,而jedis客戶端與redis交互的時候協議中定義是用byte類型交互,jedis中提供了string類型轉爲byte[]類型.
原因其實就出現在這裏,解決的辦法就是手動定義序列化的方法。
1-3:解決方法:
建議redis key序列化使用StringRedisSerializer,redis value序列化使用Jackson2JsonRedisSerializer.
//使用SpringBoot默認配置的redisTemplate
/**
* Standard Redis configuration.
*/
@Configuration
protected static class RedisConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(
RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean(StringRedisTemplate.class)
public StringRedisTemplate stringRedisTemplate(
RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}