2014-06-17 16 views
1

나는 주어진 델타에 의해 RedisAtomicLong 개체를 증가하려고 증가 할 수 없습니다 : 나는 서버에 MONITOR 명령을 사용하면이 RedisAtomicLong

redis.clients.jedis.exceptions.JedisDataException: ERR value is not an integer or out of range 

private void updateBandwidthUsage(String remoteAddr, int length) { 
    RedisAtomicLong counter = new RedisAtomicLong("someKey", redisTemplate) 
    counter.getAndAdd(length); 
    counter.expire(1, TimeUnit.DAYS); 
} 

이 실패를,이 내가 무엇이다 볼 수 있습니다 :

1403019417.097887 [0 10.0.2.2:46694] "INCRBY" "\xac\xed\x00\x05t\x00\x150:0:0:0:0:0:0:1:16238" "7625" 

저는 Jed와 함께 Spring Data Redis (1.3.0)를 사용하고 있습니다. (2.5.1) 커넥터 인 경우 서버는 Redis 2.8.6을 실행 중입니다.


편집 :

1403020463.368050 [0 10.0.2.2:47127] "SET" "\xac\xed\x00\x05t\x00\x150:0:0:0:0:0:0:1:16238" "\xac\xed\x00\x05sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x00\x00" 

답변

2

내가 인스턴스화하여 지금 문제를 해결하기 위해 관리 : 내가 직접 카운터에 레디 스에 전송되는 데이터를 set를 사용하는 경우가 꽤 이상한 보이는 : 난 그냥 뭔가 이상한 발견 RedisConnectionFactoryredisTemplate의 인스턴스가 RedisAtomicLong : 난 수 없습니다 경우

RedisAtomicLong counter = new RedisAtomicLong("someKey", redisTemplate.getConnectionFactory()); 
+0

de_serializers로 설정하지 않은'RedisTemplate'은 직렬화를 위해'ObjectOutputStream'을 사용합니다. 어떤 원자형에 전달되면이 직렬화가 거기에서도 사용되어 키와 값을 읽을 수없는 형식으로 변환합니다. 기본 'ConnectionFactory'를'RedisAtomicLong'과 함께 사용하면이 사용 사례에 더 적합한'StringRedisSerializer'로 새 템플릿을 초기화합니다. –

0

나는 비슷한 상황이 있었다 RedisAtomicInteger를 사용하여 증가시키고 "ERR 값이 정수가 아니거나 범위를 벗어났습니다."라는 오류가 발생했습니다.

template.opsForValue(). set (key, value)를 사용하여 값을 설정하고 RedisAtomicInteger 작업을 사용하고 있습니다.

기본 템플릿은 기본 serializer 즉 JdkSerializationRedisSerializer를 사용하며 RedisAtomicInteger는 StringRedisSerializer를 키와 값 모두에 사용합니다. 그래서 내가 잘못하고있는 것은 serializer의 한 유형을 사용하여 값을 설정 한 다음 다른 값을 사용하여 값을 증가시키는 것입니다.

기본 템플릿의 증가 및 설정 작업을 사용하는 경우에도 비슷한 오류가 발생하므로 모든 get, set 및 increment 작업에 RedisAtomicInteger를 사용했습니다.