Redis教程8-字符串(String)常用命令使用参考2
1.MGET
MGET key [key ...]
返回所有(一个或多个)给定 key 的值。
如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。
可用版本:>= 1.0.0
时间复杂度:O(N) , N 为给定 key 的数量。
返回值:一个包含所有给定 key 的值的列表。
127.0.0.1:6379> mget name age // name和age都不存在, 都返回nil 1) (nil) 2) (nil) 127.0.0.1:6379> set name redis666 OK 127.0.0.1:6379> mget name age // age不存在, 返回nil 1) "redis666" 2) (nil) 127.0.0.1:6379> set age 60 OK 127.0.0.1:6379> mget name age // name和age都存在 1) "redis666" 2) "60" 127.0.0.1:6379>
2.MSET
MSET key value [key value ...]
同时设置一个或多个 key-value 对。
如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用接下来的 MSETNX 命令:它只会在所有给定 key 都不存在的情况下进行设置操作。
MSET 是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。
可用版本:>= 1.0.1
时间复杂度:O(N), N 为要设置的 key 数量。
返回值:总是返回 OK (因为 MSET 不可能失败)
127.0.0.1:6379> flushdb OK 127.0.0.1:6379> 127.0.0.1:6379> set name redis666 // 设置name OK 127.0.0.1:6379> mset name redis888 age 18 tel 111112222 OK 127.0.0.1:6379> keys * 1) "age" 2) "name" 3) "tel" 127.0.0.1:6379> get name // name被覆盖了 "redis888" 127.0.0.1:6379>
3.MSETNX
MSETNX key value [key value ...]
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
即使只有一个给定 key 已存在, MSETNX 也会拒绝执行所有给定 key 的设置操作。
MSETNX 是原子性的,因此它可以用作设置多个不同 key 表示不同字段(field)的唯一性逻辑对象(unique logic object),所有字段要么全被设置,要么全不被设置。
可用版本:>= 1.0.1
时间复杂度:O(N), N 为要设置的 key 的数量。
返回值:
127.0.0.1:6379> flushdb OK 127.0.0.1:6379> set name redis666 // name存在 OK 127.0.0.1:6379> msetnx name redis888 age 18 tel 11223344 // 因为name的存在, 遵循原子性, 所有操作失败 (integer) 0 127.0.0.1:6379> keys * 1) "name" 127.0.0.1:6379> get name "redis666" 127.0.0.1:6379> msetnx age 18 tel 11223344 // age和tel都不存在, 操作成功 (integer) 1 127.0.0.1:6379> keys * 1) "age" 2) "name" 3) "tel" 127.0.0.1:6379>
4.PSETEX
PSETEX key milliseconds value
这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
可用版本:>= 2.6.0
时间复杂度:O(1)
返回值:设置成功时返回 OK 。
127.0.0.1:6379> psetex name 10000 redis666 // 设置key存在1000ms OK 127.0.0.1:6379> ttl name (integer) 7 127.0.0.1:6379> get name "redis666" 127.0.0.1:6379> pttl name (integer) 1639 127.0.0.1:6379> ttl name (integer) -2 127.0.0.1:6379> exists name (integer) 0
5.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 这三个命令。
# 对不存在的键进行设置 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 参数设置的值
6.SETEX
SETEX key seconds value
将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。
如果 key 已经存在, SETEX 命令将覆写旧值。
这个命令类似于以下两个命令:
SET key value
EXPIRE key seconds # 设置生存时间
不同之处是, SETEX 是一个原子性(atomic)操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。
可用版本:>= 2.0.0
时间复杂度:O(1)
返回值:
# 在 key 不存在时进行 SETEX redis> SETEX cache_user_id 60 1111 OK redis> GET cache_user_id # 值 "1111" redis> TTL cache_user_id # 剩余生存时间 (integer) 49 # key 已经存在时,SETEX 覆盖旧值 redis> SET cd "timeless" OK redis> SETEX cd 3000 "goodbye my love" OK redis> GET cd "goodbye my love" redis> TTL cd (integer) 2997
7.SETNX
SETNX key value
将 key 的值设为 value ,当且仅当 key 不存在。
若给定的 key 已经存在,则 SETNX 不做任何动作。
SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。
可用版本:>= 1.0.0
时间复杂度:O(1)
返回值:
redis> EXISTS job # job 不存在 (integer) 0 redis> SETNX job "programmer" # job 设置成功 (integer) 1 redis> SETNX job "code-farmer" # 尝试覆盖 job ,失败 (integer) 0 redis> GET job # 没有被覆盖 "programmer"
8.SETRANGE
SETRANGE key offset value
用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始。
不存在的 key 当作空白字符串处理。
SETRANGE 命令会确保字符串足够长以便将 value 设置在指定的偏移量上,如果给定 key 原来储存的字符串长度比偏移量小(比如字符串只有 5 个字符长,但你设置的 offset 是 10 ),那么原字符和偏移量之间的空白将用零字节(zerobytes, "\x00" )来填充。
注意你能使用的最大偏移量是 2^29-1(536870911) ,因为 Redis 字符串的大小被限制在 512 兆(megabytes)以内。如果你需要使用比这更大的空间,你可以使用多个 key 。
可用版本:>= 2.2.0
时间复杂度:
127.0.0.1:6379> set info 'hello redis666888' OK 127.0.0.1:6379> setrange info 11 world // 对非空字符串进行 SETRANGE (integer) 17 127.0.0.1:6379> get info "hello redisworld8" 127.0.0.1:6379> setrange name 3 tom // 对空 字符串/不存在 的key进行 SETRANGE (integer) 6 127.0.0.1:6379> get name "\x00\x00\x00tom" 127.0.0.1:6379>
9.STRLEN
STRLEN key
返回 key 所储存的字符串值的长度。
当 key 储存的不是字符串值时,返回一个错误。
可用版本:>= 2.2.0
复杂度:O(1)
返回值:
# 获取字符串的长度
redis> SET mykey "Hello world"
OK
redis> STRLEN mykey
(integer) 11
# 不存在的 key 长度为 0
redis> STRLEN nonexisting
(integer) 0