Redis中incr与incrBy的区别

我看网上说他们的区别
clipboard.png
但我自己试了下,发现incr也可以像incrby那样指定增加量,这样感觉这就没区别了啊,下图是我测试的结果.
clipboard.png

阅读 12.1k
4 个回答

刚才源码贴错了,修改一下


翻了下 phpredis 扩展的源码,应该是 2.0.9 开始做的兼容。

在调用 incr 时,可选的带一个long类型的数字,如果数字不为1,调用 incrby。

顺便说一句,incrBy 的时候,如果后面参数是 1,会调用 incr。

PHP_METHOD(Redis, incr){

    zval *object;
    RedisSock *redis_sock;
    char *key = NULL;
    int key_len;
    long val = 1;

    if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|l",
                                     &object, redis_ce,
                                     &key, &key_len, &val) == FAILURE) {
        RETURN_FALSE;
    }

    if(val == 1) {
        redis_atomic_increment(INTERNAL_FUNCTION_PARAM_PASSTHRU, "INCR", 1);
    } else {
        redis_atomic_increment(INTERNAL_FUNCTION_PARAM_PASSTHRU, "INCRBY", val);
    }
}

下面是Redis源码,其实incr和incrBy在底层实现上是一致的,就是incrBy需要做一下参数校验

//incr命令
void incrCommand(redisClient *c) {
    incrDecrCommand(c,1);
}
//decr命令
void decrCommand(redisClient *c) {
    incrDecrCommand(c,-1);
}
//incrBy命令
void incrbyCommand(redisClient *c) {
    long long incr;

    if (getLongLongFromObjectOrReply(c, c->argv[2], &incr, NULL) != REDIS_OK) return;
    incrDecrCommand(c,incr);
}
//decrby命令
void decrbyCommand(redisClient *c) {
    long long incr;

    if (getLongLongFromObjectOrReply(c, c->argv[2], &incr, NULL) != REDIS_OK) return;
    incrDecrCommand(c,-incr);
}

从这里可以看出incr是不支持数字参数的。

但是PHP中$redis为什么支持?可能是这个库的底层都是使用了redis的incrBy命令吧

测试了下,看不出不同,运行时间都一样,不存在incr执行多次。23000000000000000000000000000这个数字 要是执行多次,肯定要一定时间,但是和IncrBys所花时间是一样的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题