本文主要是介绍RedisTemplate的Long类型使用increment自增报错,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题描述
代码如下
@Resourceprivate RedisTemplate<String,String > redisTemplate;redisTemplate.opsForValue().set("testKey", 0L);
redisTemplate.opsForValue().increment("testKey");
工作里用Long类型存储评论数,在使用increment自增时报错,报错信息如下
redis ERR value is not an integer or out of range
原因分析:
查看redis存入的数据发现是0L,读取出来是Long类型没有问题,但是不能自增,没有L可以正常。查了查redisTemplate是对对象序列化然后存储的,所以存入0L是因为序列化的原因。
解决方案:
redisTamplate支持在配置中指定各种类型的序列化方式,将value类型的序列化方式
// 将对象序列化
ObjectMapper om=new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
// json序列化配置
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
注意:这样改之后,存入redis中直接取出来是int类型,如需Long接收需要转换
这篇关于RedisTemplate的Long类型使用increment自增报错的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!