INCR key
起始版本:1.0.0 时间复杂度: O(1)
对存储在指定key的数值执行原子的加1操作。 如果指定的key不存在,那么在执行incr操作之前,会先将它的值设定为0。 如果指定的key中存储的值不是字符串类型(fix: ) 或者存储的字符串类型不能表示为一个整数,
那么执行这个命令时服务器会返回一个错误(eq:(error) ERR value is not an integer or out of range)。
这个操作仅限于64位有符号整形数据
注意:由于redis并没有一个明确的类型来表示整形数据,所以这个操作是一个字符串操作。
执行这个操作的时候,key对应存储的字符串被解析为10进制的64位有符号整形数据。
事实上,Redis内部采用整数形式(Integer representation)来存储对应的整数值,所以对该类字符串值实际上是用整数保存,也就不存在存储整数的字符串表示(String representation) 所带来的额外消耗。
返回值
integer-reply: 执行递增操作后key对应的值。
例子
127.0.0.1:32768> SET mykey "10"
OK
127.0.0.1:32768> INCR mykey
(integer) 11
127.0.0.1:32768> GET mykey
"11"
127.0.0.1:32768>
实例:计数器
Redis的原子递增操作最常用的使用场景是计数器。 使用思路是:每次有相关操作的时候,就向Redis服务器发送一个incr命令。
例如这样一个场景:我们有一个web应用,我们想记录每个用户每天访问这个网站的次数。
web应用只需要通过拼接用户id和代表当前时间的字符串作为key,每次用户访问这个页面的时候对这个key执行一下incr命令。
这个场景可以有很多种扩展方法:
通过结合INCR和EXPIRE命令,可以实现一个只记录用户在指定间隔时间内的访问次数的计数器
客户端可以通过GETSET命令获取当前计数器的值并且重置为0
通过类假于DECR或者INCRBY等原子递增/递减的命令,可以根据用户的操作来增加或减少某些值 比如在线游戏,需要对用户的游戏分数进行实时控制,分数可能增加可能减少。