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
答案 0 :(得分:1)
在您实际调用SET
命令之前,您一直在尝试递增名为'100'的键,该键不包含有效的整数表示形式。
将名为“ 100”的键设置为字符串“ 1”后,增量成功,并按预期返回2(1 + 1)。
答案 1 :(得分:0)
如果您使用 Java 和 Spring Boot,您可以这样做:
声明类StringRedisTemplate
的一个属性,例如:
private final StringRedisTemplate redisTemplate;
您有两个选择:
String key = "a";
int value = 3;
redisTemplate.boundValueOps(key).set(String.valueOf(value));
Long turn = redisTemplate.boundValueOps(key).increment(); // -> 4
你也可以不先设置值而递增,在这种情况下,第一个值将是 1:
String otherKey = "b";
Long turn = redisTemplate.boundValueOps(otherKey).increment(); // -> 1
你可以找到一个完整的例子here