redisTemplate.opsForValue().set(key, value) 方法调用的时候,value明明是int值,但是set进去的时候,确实是一个字符串值,key也带上了16禁止的前缀。如下图所示。 且同样的代码,在本机环境就不会有该问题,打包发布到测试环境,就会这样的问题。 项目中引起的问题是调用increment的时候,会发生 Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: ERR value is not an integer or out of range异常。
解决:其实就是redistemplate没有设置序列化导致的。只要将序列化设置好就解决。如下举例
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setConnectionFactory(factory);
//key序列化方式
template.setKeySerializer(redisSerializer);
//value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
//value hashmap序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
//是否开启事务,true为开启
template.setEnableTransactionSupport(false);
return template;
}
}