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 的数量。

返回值:

当所有 key 都成功设置,返回 1 。
如果所有给定 key 都设置失败(至少有一个 key 已经存在),那么返回 0 。
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 参数设置的值
View Code

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)

返回值:

设置成功时返回 OK 。
当 seconds 参数不合法时,返回一个错误。
# 在 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)

返回值:

设置成功,返回 1 。
设置失败,返回 0 。
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

时间复杂度:

对小(small)的字符串,平摊复杂度O(1)。(关于什么字符串是”小”的,请参考 APPEND 命令)
否则为O(M), M 为 value 参数的长度。
返回值:被 SETRANGE 修改之后,字符串的长度。
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)

返回值:

字符串值的长度。
当 key 不存在时,返回 0 。
# 获取字符串的长度

redis> SET mykey "Hello world"
OK

redis> STRLEN mykey
(integer) 11


# 不存在的 key 长度为 0

redis> STRLEN nonexisting
(integer) 0
posted @ 2020-09-21 14:15  KILLNPE  阅读(182)  评论(0编辑  收藏  举报