【问题标题】:Redis incrementing a numeric value - ERR value is not an integer or out of rangeRedis递增数值-ERR值不是整数或超出范围
【发布时间】:2019-03-29 10:37:45
【问题描述】:

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

【问题讨论】:

    标签: redis key-value redis-cli


    【解决方案1】:

    如果您使用的是 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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 但是当我输入:incr "Ahmedov" 例如,没有先调用 Set 时,我没有得到那个错误。
      • 这也是意料之中的 - 在不存在的键上调用 INCR 会隐式将其值初始化为 0。IIRC,这在文档中得到了很好的引用。
      猜你喜欢
      • 2018-05-31
      • 1970-01-01
      • 2021-08-29
      • 2014-04-14
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      相关资源
      最近更新 更多