我看網上說他們的區別但我自己試了下,發現incr也可以像incrby那樣指定增加量,這樣感覺這就沒區別了啊,下圖是我測試的結果.
认证0级讲师
下面是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指令吧
剛才源碼貼錯了,修改一下
翻了下 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); } }
http://redisdoc.com/string/in...http://redisdoc.com/string/in...是不是在redis 內部的執行會不一樣? incr 傳遞參數的話,需要執行參數指定次數但是incrby 的話,只要執行1次計算,得再去證實一下
測試了下,看不出不同,運行時間都一樣,不存在incr執行多次。 23000000000000000000000000000這個數字 要是執行多次,肯定要一定時間,但是和IncrBys所花時間是一樣的
下面是Redis源碼,其實incr和incrBy在底層實作上是一致的,就是incrBy需要做一下參數校驗
從這裡可以看出incr是不支援數字參數的。
但是PHP中$redis為什麼支持?可能是這個函式庫的底層都是使用了redis的incrBy指令吧
剛才源碼貼錯了,修改一下
翻了下 phpredis 擴充的源碼,應該是 2.0.9 開始做的相容。
在呼叫 incr 時,可選的帶一個long類型的數字,如果數字不為1,調用 incrby。
順便說一句,incrBy 的時候,如果後面參數是 1,會呼叫 incr。
http://redisdoc.com/string/in...
http://redisdoc.com/string/in...
是不是在redis 內部的執行會不一樣? incr 傳遞參數的話,需要執行參數指定次數
但是incrby 的話,只要執行1次計算,得再去證實一下
測試了下,看不出不同,運行時間都一樣,不存在incr執行多次。 23000000000000000000000000000這個數字 要是執行多次,肯定要一定時間,但是和IncrBys所花時間是一樣的