我看網(wǎng)上說他們的區(qū)別
但我自己試了下,發(fā)現(xiàn)incr也可以像incrby那樣指定增加量,這樣感覺這就沒區(qū)別了啊,下圖是我測試的結(jié)果.
認(rèn)證0級講師
下面是Redis源碼,其實(shí)incr和incrBy在底層實(shí)現(xiàn)上是一致的,就是incrBy需要做一下參數(shù)校驗(yàn)
//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是不支持?jǐn)?shù)字參數(shù)的。
但是PHP中$redis為什么支持?可能是這個(gè)庫的底層都是使用了redis的incrBy命令吧
剛才源碼貼錯(cuò)了,修改一下
翻了下 phpredis 擴(kuò)展的源碼,應(yīng)該是 2.0.9 開始做的兼容。
在調(diào)用 incr 時(shí),可選的帶一個(gè)long類型的數(shù)字,如果數(shù)字不為1,調(diào)用 incrby。
順便說一句,incrBy 的時(shí)候,如果后面參數(shù)是 1,會調(diào)用 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);
}
}
http://redisdoc.com/string/in...
http://redisdoc.com/string/in...
是不是在redis 內(nèi)部的執(zhí)行會不一樣?incr 傳遞參數(shù)的話,需要執(zhí)行參數(shù)指定次數(shù)
但是incrby 的話,只要執(zhí)行1次計(jì)算,得再去證實(shí)一下
測試了下,看不出不同,運(yùn)行時(shí)間都一樣,不存在incr執(zhí)行多次。23000000000000000000000000000這個(gè)數(shù)字 要是執(zhí)行多次,肯定要一定時(shí)間,但是和IncrBys所花時(shí)間是一樣的