我看网上说他们的区别但我自己试了下,发现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所花时间是一样的