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

时间:2018-10-24 22:23:48

标签: redis key-value redis-cli

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

仅当增加不存在的Integer键时,此行为才成立:

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

2 个答案:

答案 0 :(得分:1)

在您实际调用SET命令之前,您一直在尝试递增名为'100'的键,该键不包含有效的整数表示形式。

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

答案 1 :(得分: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

你可以找到一个完整的例子here