1.INCRBY
INCRBY key increment
将key所储存的值加上增量increment。
如果key不存在,那么key的值会被初始化为0,然后再执行INCRBY命令。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
返回值:
加上increment之后,key的值。
命令:
# key 存在且是数字值
redis> SET rank 50
OK
redis> INCRBY rank 20
(integer) 70
redis> GET rank
"70"
# key 不存在时
redis> EXISTS counter
(integer) 0
redis> INCRBY counter 30
(integer) 30
redis> GET counter
"30"
# key 不是数字值时
redis> SET book "long long ago..."
OK
redis> INCRBY book 200
(error) ERR value is not an integer or out of range
2.INCRBYFLOAT
INCRBYFLOAT key increment
为key中所存储的值加上浮点数增量increment。
如果key不存在,那么INCRBYFLOAT会将key的值设为0,再执行加法操作。
如果命令执行成功,那么key的值会被更新为(执行加法之后的)新值,并且新值会以字符串的形式返回给调用者。
无论是 key 的值,还是增量 increment ,都可以使用像 2.0e7 、 3e5 、 90e-2 那样的指数符号(exponential notation)来表示,但是,执行 INCRBYFLOAT 命令之后的值总是以同样的形式储存,也即是,它们总是由一个数字,一个(可选的)小数点和一个任意位的小数部分组成(比如 3.14 、 69.768 ,诸如此类),小数部分尾随的 0 会被移除,如果有需要的话,还会将浮点数改为整数(比如 3.0 会被保存成 3 )。
除此之外,无论加法计算所得的浮点数的实际精度有多长, INCRBYFLOAT 的计算结果也最多只能表示小数点的后十七位。
当以下任意一个条件发生时,返回一个错误:
①key的值不是字符串类型(因为redis中的数字和浮点数都是以字符串的形式保存,所以它们都属于字符串类型)
②key当前的值或者给定的增量increment不能解释(parse)为双精度。
返回值:
执行命令之后key的值。
命令:
# 值和增量都不是指数符号
redis> SET mykey 10.50
OK
redis> INCRBYFLOAT mykey 0.1
"10.6"
# 值和增量都是指数符号
redis> SET mykey 314e-2
OK
redis> GET mykey # 用 SET 设置的值可以是指数符号
"314e-2"
redis> INCRBYFLOAT mykey 0 # 但执行 INCRBYFLOAT 之后格式会被改成非指数符号
"3.14"
# 可以对整数类型执行
redis> SET mykey 3
OK
redis> INCRBYFLOAT mykey 1.1
"4.1"
# 后跟的 0 会被移除
redis> SET mykey 3.0
OK
redis> GET mykey # SET 设置的值小数部分可以是 0
"3.0"
redis> INCRBYFLOAT mykey 1.000000000000000000000 # 但 INCRBYFLOAT 会将无用的 0 忽略掉,有需要的话,将浮点变为整数
"4"
redis> GET mykey
"4"
3.MGET
MGET key [key...]
返回所有(一个或多个)给定key的值。
如果给定的key里面,有某个key不存在,那么这个key返回特殊值nil。因此,该命令永不失败。
返回值:
一个包含所有给定key的值的列表。
命令:
redis> SET redis redis.com
OK
redis> SET mongodb mongodb.org
OK
redis> MGET redis mongodb
1) "redis.com"
2) "mongodb.org"
redis> MGET redis mongodb mysql # 不存在的 mysql 返回 nil
1) "redis.com"
2) "mongodb.org"
3) (nil)
4.MSET
MSET key value [key value ....]
同时设置一个或多个key-value对。
如果某个给定的key已经存在,那么MSET会用新值覆盖原来的旧值。
MSET是一个原子性的操作,所有给定key都会在同一时间内被设置,某些给定key被更新而另一些给定key没有改变的情况,不可能发生。
返回值:
总是返回OK(因为MSET不可能失败)
命令:
redis> MSET date "2012.3.30" time "11:00 a.m." weather "sunny"
OK
redis> MGET date time weather
1) "2012.3.30"
2) "11:00 a.m."
3) "sunny"
# MSET 覆盖旧值例子
redis> SET google "google.hk"
OK
redis> MSET google "google.com"
OK
redis> GET google
"google.com"
5.MSETNX
MSETNX key value [key value....]
同时设置一个或多个key-value对,当且仅当所有给定的key都不存在。
即使只有一个给定key已经存在,MSETNX也会拒绝执行所有给定key的设置操作。
MSETNX是原子性的,因为它可以用作设置多个不同key表示不同字段(field)的唯一性逻辑对象(unique logic object),所有字段要么全被设置,要么全不被设置。
返回值:
当所有key都成功设置,返回1。
如果所有给定key都设置失败(至少有一个key已经存在),那么返回0。
命令:
# 对不存在的 key 进行 MSETNX
redis> MSETNX rmdbs "MySQL" nosql "MongoDB" key-value-store "redis"
(integer) 1
redis> MGET rmdbs nosql key-value-store
1) "MySQL"
2) "MongoDB"
3) "redis"
# MSET 的给定 key 当中有已存在的 key
redis> MSETNX rmdbs "Sqlite" language "python" # rmdbs 键已经存在,操作失败
(integer) 0
redis> EXISTS language # 因为 MSET 是原子性操作,language 没有被设置
(integer) 0
redis> GET rmdbs # rmdbs 也没有被修改
"MySQL"
6.SET
SET key value [EX seconds] [PX milliseconds] [NX|XX]
将字符串值value关联到key。
如果key已经持有其他值,SET就覆写旧值,无视类型。
对于某个原本带有生存时间(TTL)的键涞水,当SET命令成功在这个键上执行时,这个键原有的TTL将被清除。
可选参数:
从 Redis 2.6.12 版本开始, SET 命令的行为可以通过一系列参数来修改:
EX second :设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。
PX millisecond :设置键的过期时间为 millisecond 毫秒。 SET key value PX millisecond 效果等同于 PSETEX key millisecond value 。
NX :只在键不存在时,才对键进行设置操作。 SET key value NX 效果等同于 SETNX key value 。
XX :只在键已经存在时,才对键进行设置操作。
注意:因为 SET 命令可以通过参数来实现和 SETNX 、 SETEX 和 PSETEX 三个命令的效果,所以将来的 Redis 版本可能会废弃并最终移除 SETNX 、 SETEX 和 PSETEX 这三个命令。
返回值:
在redis2.6.12版本以前,SET命令总是返回OK。
从redis2.6.12版本开始,SET在设置操作成功完成时,才返回OK。如果设置了NX或者XX,但因为条件没达到而造成设置操作未执行,那么命令返回空批量回复(NULL Bulk Reply)。
命令:
# 对不存在的键进行设置
redis 127.0.0.1:6379> SET key "value"
OK
redis 127.0.0.1:6379> GET key
"value"
# 对已存在的键进行设置
redis 127.0.0.1:6379> SET key "new-value"
OK
redis 127.0.0.1:6379> GET key
"new-value"
# 使用 EX 选项
redis 127.0.0.1:6379> SET key-with-expire-time "hello" EX 10086
OK
redis 127.0.0.1:6379> GET key-with-expire-time
"hello"
redis 127.0.0.1:6379> TTL key-with-expire-time
(integer) 10069
# 使用 PX 选项
redis 127.0.0.1:6379> SET key-with-pexpire-time "moto" PX 123321
OK
redis 127.0.0.1:6379> GET key-with-pexpire-time
"moto"
redis 127.0.0.1:6379> PTTL key-with-pexpire-time
(integer) 111939
# 使用 NX 选项
redis 127.0.0.1:6379> SET not-exists-key "value" NX
OK # 键不存在,设置成功
redis 127.0.0.1:6379> GET not-exists-key
"value"
redis 127.0.0.1:6379> SET not-exists-key "new-value" NX
(nil) # 键已经存在,设置失败
redis 127.0.0.1:6379> GEt not-exists-key
"value" # 维持原值不变
# 使用 XX 选项
redis 127.0.0.1:6379> EXISTS exists-key
(integer) 0
redis 127.0.0.1:6379> SET exists-key "value" XX
(nil) # 因为键不存在,设置失败
redis 127.0.0.1:6379> SET exists-key "value"
OK # 先给键设置一个值
redis 127.0.0.1:6379> SET exists-key "new-value" XX
OK # 设置新值成功
redis 127.0.0.1:6379> GET exists-key
"new-value"
# NX 或 XX 可以和 EX 或者 PX 组合使用
redis 127.0.0.1:6379> SET key-with-expire-and-NX "hello" EX 10086 NX
OK
redis 127.0.0.1:6379> GET key-with-expire-and-NX
"hello"
redis 127.0.0.1:6379> TTL key-with-expire-and-NX
(integer) 10063
redis 127.0.0.1:6379> SET key-with-pexpire-and-XX "old value"
OK
redis 127.0.0.1:6379> SET key-with-pexpire-and-XX "new value" PX 123321
OK
redis 127.0.0.1:6379> GET key-with-pexpire-and-XX
"new value"
redis 127.0.0.1:6379> PTTL key-with-pexpire-and-XX
(integer) 112999
# EX 和 PX 可以同时出现,但后面给出的选项会覆盖前面给出的选项
redis 127.0.0.1:6379> SET key "value" EX 1000 PX 5000000
OK
redis 127.0.0.1:6379> TTL key
(integer) 4993 # 这是 PX 参数设置的值
redis 127.0.0.1:6379> SET another-key "value" PX 5000000 EX 1000
OK
redis 127.0.0.1:6379> TTL another-key
(integer) 997 # 这是 EX 参数设置的值
使用模式
命令SET resource-name anystring NX EX max-lock-time 是一种在redis中实现锁的简单方法。
客户端执行以上的命令:
①如果服务器返回OK,那么这个客户端获得锁。
②如果服务器返回NIL,那么客户端获取锁失败,可以在稍后再重试。
设置的过期时间到达之后,锁将自动释放。
可以通过以下修改,让这个锁实现更健壮:
①不使用固定的字符串作为键的值,而是设置一个不可预测(non-guessable)的长随机字符串,作为口令串(token)。
②不使用DEL命令释放锁,而是发送一个Lua脚本,这个脚本只在客户端传入的值和键的口令相匹配时,才对键进行删除。
这两个改动可以防止持有过期锁的客户端误删现有锁的情况出现。
以下是一个简单的解锁脚本示例:
if redis.call(“get”,KEYS[1]) == ARGV[1]
then
return redis.call(“del”,KEYS[1])
else
return 0
end
这个脚本可以通过
EVAL ...script... 1 resource-name token-value
命令来调用。
7.SETBIT
SETBIT key offset value
对key所储存的字符串值,设置或清除指定偏移量上的位(bit)。
位的设置或清除取决于value参数,可以是0也可以是1。
当key不存在时,自动生成一个新的字符串的值。
字符串会进行伸展(grown)以确保它可以将value保存在指定的偏移量上。当字符串值进行伸展时,空白位置以0填充。
Offset参数必须大于或等于0,小于2^32(bit映射被限制在512MB之内)。
返回值:
指定偏移量原来储存的位。
命令:
redis> SETBIT bit 10086 1
(integer) 0
redis> GETBIT bit 10086
(integer) 1
redis> GETBIT bit 100 # bit 默认被初始化为 0
(integer) 0
8.SETRANGE
SETRANGE key offset value
用value参数覆写(overwrite)给定key所储存的字符串值,从偏移量offset开始。
不存在的key当作空白字符串处理。
SETRANGE命令会确保字符串够长以便将value设置在指定偏移量上,如果给定key原来储存的字符串长度比偏移量小(比如字符串只有5个字符长,但你设置的offset是10),那么原字符串和偏移量之间的空白将用零字节(“\x00”)来填充。
返回值:
被SETRANGE修改值,字符串的长度。
命令:
# 对非空字符串进行 SETRANGE
redis> SET greeting "hello world"
OK
redis> SETRANGE greeting 6 "Redis"
(integer) 11
redis> GET greeting
"hello Redis"
# 对空字符串/不存在的 key 进行 SETRANGE
redis> EXISTS empty_string
(integer) 0
redis> SETRANGE empty_string 5 "Redis!" # 对不存在的 key 使用 SETRANGE
(integer) 11
redis> GET empty_string # 空白处被"\x00"填充
"\x00\x00\x00\x00\x00Redis!"
模式
因为有了SETRANGE和GETRANGE命令,你可以将redis字符串用作具有o(1)随机访问时间的线性数组,这在很多真实用例中都是非常快速且高效的储存方式。
9.STRLEN
STRLEN key
返回key所储存的字符串值的长度。
当key储存的不是字符串值时,返回一个错误。
返回值:
字符串值的长度。
当key不存在时,返回0。
命令:
# 获取字符串的长度
redis> SET mykey "Hello world"
OK
redis> STRLEN mykey
(integer) 11
# 不存在的 key 长度为 0
redis> STRLEN nonexisting
(integer) 0
127.0.0.1:6379> lpush kk 11 22 33
(integer) 3
127.0.0.1:6379> STRLEN kk #当key储存的不是字符串值时,返回一个错误。
(error) WRONGTYPE Operation against a key holding the wrong kind of value