Redis与Memcached的incr/decr差异对比

Redis和Memcached均支持对整数型Value值的增减,对应到具体命令中就是incr和decr命令。两个系统在这两个命令的具体语法上略有不同。

Redis的incr命令语法分两种:
   1)incr key,即将指定主键key的value值加一;
   2)incrby key increment,即将指定主键key的value值加上increment。

Redis的decr命令语法同样分为两种:
   1)decr key,即将指定主键key的value值减一;
   2)decrby key decrement,即将指定主键key的value值减去decrement。

Memcached的incr命令语法为incr key integer,即将指定主键key的value值加上给定的integer,decr命令语法为decr key interger,即将指定主键key的value值减去给定的interger。

那么Redis和Memcached对整数型Value值的增减只是上面那些语法的不同么?非也!两者最大的不同在于Redis支持的整数型Value值的具体类型为带符号64-bit整数,而Memcached支持的整数型Value值的具体类型为无符号64-bit整数,这就导致两个系统支持的整数型Value值的取值范围是不一样的。

Redis支持的整数型Value值范围是-9223372036854775808~9223372036854775807,而Memcached的范围则是0~18446744073709551615。

事实胜于雄辩,下面我们就通过两个系统的执行情况来看一看事实是否如此吧,列位上眼!

首先,我们来看一看Redis的执行情况:

1)先为一个主键赋一个带符号64-bit整数最大值9223372036854775807;
redis 127.0.0.1:6379> set max 9223372036854775807
OK

2)将该主键的值加一,系统提示此加一动作会导致向上溢出,由此可见Redis支持的最大整数型Value值确实为9223372036854775807;
redis 127.0.0.1:6379> incr max
(error) ERR increment or decrement would overflow

3)再为一个主键赋一个带符号64-bit整数最小值-9223372036854775808;
redis 127.0.0.1:6379> set min -9223372036854775808
OK

4)将该主键的值减一,系统提示此减一操作会导致向下溢出,由此可见Redis支持的最小整数型Value值确实为-9223372036854775808;
redis 127.0.0.1:6379> decr min
(error) ERR increment or decrement would overflow

然后,我们再来看一看Memcached的执行情况:
1)先为一个主键赋一个无符号64-bit整数最大值18446744073709551615;
set max 0 0 20
18446744073709551615
STORED

2)将该主键的值加一,系统的执行结果为0,即系统自身会自动避免向上溢出,这样Memcached支持的整数型Value值的值域就变成了一个首尾相接的环,由此可见Memcached支持的最大整数型Value值确实应该为
18446744073709551615;
incr max 1
0

3)再为一个主键赋一个无符号64-bit整数最小值0;
set min 0 0 1
0
STORED

4)将该主键的值减一,系统的执行结果还是0,即系统自身会自动避免向下溢出,由此可见Memcached支持的最小整数型Value值确实应该为0;
decr min 1
0

5)在上面我们说Memcached支持的整数型Value值的值域是一个首尾相接的环,这样不是严谨的说法,这个环仅对向上溢出有效,对向下溢出无效。下面的例子我们将Memcached支持的最大整数型值加二,系统返回的结果为1,即结果值是沿着向上溢出方向的第二个值。上面的例子我们将Memcached支持的最小整数型值减一,结果值还是0,而不是沿着向下溢出方向的第一个值18446744073709551615,所以说值域环仅对向上溢出有效。
set max 0 0 20
18446744073709551615
STORED
incr max 2
1

你可能感兴趣的:(memcached)