Redis递增数值- ERR值不是整数或超出范围。

4

Redis incr 函数的行为不稳定。当尝试递增任何未设置的正整数键时,会出现以下错误。但是,当首先使用set设置它,然后使用incr递增同一个键时,问题就不存在了。有什么原因导致它表现出这种行为吗?有什么解决方法吗?

127.0.0.1:6379[5]> incr 100
(error) ERR value is not an integer or out of range
127.0.0.1:6379[5]> incr '100'
(error) ERR value is not an integer or out of range
127.0.0.1:6379[5]> incr "100"
(error) ERR value is not an integer or out of range
127.0.0.1:6379[5]> set 100 1
OK
127.0.0.1:6379[5]> incr 100
(integer) 2

只有在增加不存在的整数键时才会出现此行为:

127.0.0.1:6379> get "ahmedov"
(nil)
127.0.0.1:6379> incr "ahmedov"
(integer) 1
127.0.0.1:6379> incr "ahmedov"
(integer) 2
127.0.0.1:6379> get 12.1
(nil)
127.0.0.1:6379> incr 12.1
(integer) 1
127.0.0.1:6379> get -1
(nil)
127.0.0.1:6379> incr -1
(integer) 1
3个回答

3

在执行SET命令之前,您试图递增一个名为“100”的键,该键不包含整数数字的有效表示。

设置名为“100”的键为字符串“1”后,递增成功并按预期返回2(1 + 1)。


但是,当我键入“incr“Ahmedov””时,例如,在没有首先调用Set的情况下,我不会收到那个错误。 - Ahmadov
1
这也是可以预料的 - 在不存在的键上调用INCR会隐式地将其值初始化为0。如果我没记错,文档中已经很好地引用了这一点。 - Itamar Haber

0
如果您正在使用Java和Spring Boot,以下是您可以执行的操作:
声明一个类属性StringRedisTemplate,例如:
private final StringRedisTemplate redisTemplate;

你有两个选项:

  1. 设置并递增
String key = "a";
int value = 3;
redisTemplate.boundValueOps(key).set(String.valueOf(value));
Long turn = redisTemplate.boundValueOps(key).increment(); // -> 4
  1. 递增

您也可以在不先设置值的情况下进行递增,在这种情况下,第一个值将为1:

String otherKey = "b";
Long turn = redisTemplate.boundValueOps(otherKey).increment(); // -> 1

你可以在这里找到一个完整的例子这里


-1
请在增量操作中使用StringRedisTemplate而不是RedisTemplate。由于“increment()”方法是基于字符串的活动,建议使用StringRedisTemplate。请参见以下示例。
定义StringRedisTemplate
    @Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) {
    StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
    stringRedisTemplate.setConnectionFactory(connectionFactory);
    // Add some specific configuration here. Key serializers, etc.
    return stringRedisTemplate;
}

设置初始值的增量键

@Autowired
private StringRedisTemplate stringRedisTemplate;

stringRedisTemplate.opsForValue().set("key", "100");

获取增量

Long increment = stringRedisTemplate.opsForValue().increment("key");

结果

increment is :101

这是经过验证并且可行的,让我们开始编码吧...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接