1

我正在尝试RedisAtomicLong通过给定的增量增加一个对象:

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

这失败了

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

当我MONITOR在服务器上使用命令时,我可以看到:

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

我正在使用带有 Jedis (2.5.1) 连接器的 Spring Data Redis (1.3.0),服务器正在运行 Redis 2.8.6。


编辑:我刚刚注意到一些奇怪的事情:当我set在计数器上手动使用时,发送到 Redis 的数据看起来很奇怪:

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"
4

2 回答 2

2

I managed to solve the issue now by instantiating the RedisAtomicLong with the redisTemplate's instance of RedisConnectionFactory:

RedisAtomicLong counter = new RedisAtomicLong("someKey", redisTemplate.getConnectionFactory());
于 2014-06-18T07:29:12.063 回答
0

我遇到了类似的情况,我无法使用 RedisAtomicInteger 递增并且收到此错误“ERR 值不是整数或超出范围”。

我使用 template.opsForValue().set(key,value) 设置我的值,然后为了增加我使用 RedisAtomicInteger 操作。

这里的问题是默认模板使用默认序列化程序,即 JdkSerializationRedisSerializer 和 RedisAtomicInteger 对键和值都使用 StringRedisSerializer。所以我做错的是我使用一种类型的序列化程序设置我的值,然后使用另一种增加它。

使用默认模板的增量和设置操作仍然会产生类似的错误,因此,我使用 RedisAtomicInteger 进行所有获取、设置、增量操作。

于 2016-05-12T15:09:59.470 回答