Redis之字符串

138 阅读7分钟

转载自:redisdoc.com/string/inde…

SET

格式:SET key value [EX seconds] [PX milliseconds] [NX|XX]

将字符串值 value 关联到 key

如果 key 已经持有其他值, SET 就覆写旧值, 无视类型。

SET 命令对一个带有生存时间(TTL)的键进行设置之后, 该键原有的 TTL 将被清除。

可选参数

  • EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value
  • PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value PX milliseconds 的效果等同于执行 PSETEX key milliseconds value
  • NX : 只在键不存在时, 才对键进行设置操作。 执行 SET key value NX 的效果等同于执行 SETNX key value
  • XX : 只在键已经存在时, 才对键进行设置操作。
127.0.0.1:6379> set key "value"
OK
127.0.0.1:6379> get key
"value"
127.0.0.1:6379> set key "new-value"
OK
127.0.0.1:6379> get key
"new-value"

# 使用ex
127.0.0.1:6379> set key-with-expire-time "hello" ex 60
OK
127.0.0.1:6379> get key-with-expire-time
"hello"
127.0.0.1:6379> get key-with-expire-time
(nil)

# 使用px
127.0.0.1:6379> set key-with-pexpire-time "moto" px 10000
OK
127.0.0.1:6379> get key-with-pexpire-time
"moto"
127.0.0.1:6379> get key-with-pexpire-time
"moto"
127.0.0.1:6379> get key-with-pexpire-time
(nil)

#使用nx
127.0.0.1:6379> set not-exists-key "value" nx
OK	# 键不存在,设置成功
127.0.0.1:6379> get not-exists-key
"value"
127.0.0.1:6379> set not-exists-key "new-value" nx
(nil)
127.0.0.1:6379> get not-exists-key
"value"

#使用xx
127.0.0.1:6379> exists exists-key
(integer) 0
127.0.0.1:6379> set exists-key "value" xx
(nil)	# 因为键不存在,设置失败
127.0.0.1:6379> set exists-key "value"
OK
127.0.0.1:6379> set exists-key "new-value" xx
OK
127.0.0.1:6379> get exists-key
"new-value"



SETNX

SETNX key value

只在键 key 不存在的情况下, 将键 key 的值设置为 value

若键 key 已经存在, 则 SETNX 命令不做任何动作。

SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。

命令在设置成功时返回 1 , 设置失败时返回 0

127.0.0.1:6379> exists job
(integer) 0
127.0.0.1:6379> setnx job "programmer"
(integer) 1
127.0.0.1:6379> setnx job "code-farmer"	# 尝试覆盖 job ,失败
(integer) 0	
127.0.0.1:6379> get job
"programmer"

SETEX

SETEX key seconds value

将键 key 的值设置为 value , 并将键 key 的生存时间设置为 seconds 秒钟。

如果键 key 已经存在, 那么 SETEX 命令将覆盖已有的值。

SETEX 和这两个命令的不同之处在于 SETEX 是一个原子(atomic)操作, 它可以在同一时间内完成设置值和设置过期时间这两个操作, 因此 SETEX 命令在储存缓存的时候非常实用。

# 在键 key 不存在的情况下执行 SETEX 
127.0.0.1:6379> setex cache_user_id 60 "value"
OK
127.0.0.1:6379> get cache_user
(nil)
127.0.0.1:6379> get cache_user_id
"value"

# 键 key 已经存在, 使用 SETEX 覆盖旧值
127.0.0.1:6379> set cd "timeless"
OK
127.0.0.1:6379> setex cd 60 "goodbyte my love"
OK
127.0.0.1:6379> get cd
"goodbyte my love"
127.0.0.1:6379> ttl cd
(integer) 51
127.0.0.1:6379> ttl cd
(integer) 49
127.0.0.1:6379> 

PSETEX

这个命令和 SETEX 命令相似, 但它以毫秒为单位设置 key 的生存时间, 而不是像 SETEX 命令那样以秒为单位进行设置。

127.0.0.1:6379> psetex mykey 10000 "Hello"
OK
127.0.0.1:6379> get mykey
"Hello"
127.0.0.1:6379> pttl mykey
(integer) 4528
127.0.0.1:6379> pttl mykey
(integer) 2688
127.0.0.1:6379> pttl mykey
(integer) 1780
127.0.0.1:6379> pttl mykey
(integer) 944
127.0.0.1:6379> pttl mykey
(integer) 184
127.0.0.1:6379> pttl mykey
(integer) -2
127.0.0.1:6379> pttl mykey 

GET

返回与键 key 相关联的字符串值。

如果键 key 不存在, 那么返回特殊值 nil ; 否则, 返回键 key 的值。

如果键 key 的值并非字符串类型, 那么返回一个错误, 因为 GET 命令只能用于字符串值。

127.0.0.1:6379> get db
(nil)
127.0.0.1:6379> set db redis
OK
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> del db
(integer) 1
127.0.0.1:6379> lpush db redis mongodb mysql
(integer) 3
127.0.0.1:6379> get db
(error) WRONGTYPE Operation against a key holding the wrong kind of value

GETSET

将键 key 的值设为 value , 并返回键 key 在被设置之前的旧值。

返回给定键 key 的旧值。

如果键 key 没有旧值, 也即是说, 键 key 在被设置之前并不存在, 那么命令返回 nil

当键 key 存在但不是字符串类型时, 命令返回一个错误。

127.0.0.1:6379> getset db mongodb
(nil)
127.0.0.1:6379> get db
"mongodb"
127.0.0.1:6379> getset db redis
"mongodb"

STRLEN

返回键 key 储存的字符串值的长度。

不存在的建长度为零

127.0.0.1:6379> strlen mykey
(integer) 11

APPEND

如果键 key 已经存在并且它的值是一个字符串, APPEND 命令将把 value 追加到键 key 现有值的末尾。

如果 key 不存在, APPEND 就简单地将键 key 的值设为 value , 就像执行 SET key value 一样。

127.0.0.1:6379> exists myphone
(integer) 0
127.0.0.1:6379> append myphone "nokia"
(integer) 5
127.0.0.1:6379> append myphone " - 1110"
(integer) 12
127.0.0.1:6379> get myphone
"nokia - 1110"

SETRANGE

从偏移量 offset 开始, 用 value 参数覆写(overwrite)键 key 储存的字符串值。

不存在的键 key 当作空白字符串处理。

127.0.0.1:6379> set greeting  "hello world"
OK
127.0.0.1:6379> setrange greeting 6 "redis"
(integer) 11
127.0.0.1:6379> get greeting
"hello redis"
127.0.0.1:6379> exists empty_string
(integer) 0
127.0.0.1:6379> setrange empty_string 5 "redis"
(integer) 10
127.0.0.1:6379> get empty_string
"\x00\x00\x00\x00\x00redis"

GETRANGE

返回键 key 储存的字符串值的指定部分, 字符串的截取范围由 startend 两个偏移量决定 (包括 startend 在内)。

127.0.0.1:6379> set greeting "hello,my friend"
OK
127.0.0.1:6379> getrange greeting 0 4	# 返回索引0-4的字符,包括4。
"hello"
127.0.0.1:6379> getrange greeting -1 -5	# 不支持回绕操作
""
127.0.0.1:6379> getrange greeting -3 -1	 # 负数索引
"end"
127.0.0.1:6379> getrange greeting 0 -1	 # 从第一个到最后一个
"hello,my friend"

INCR

为键 key 储存的数字值加上一。

如果键 key 不存在, 那么它的值会先被初始化为 0 , 然后再执行 INCR 命令。

如果键 key 储存的值不能被解释为数字, 那么 INCR 命令将返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

127.0.0.1:6379> set page_view 20
OK
127.0.0.1:6379> incr page_view
(integer) 21
127.0.0.1:6379> get page_view
"21"

INCRBY

为键 key 储存的数字值加上增量 increment

如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 INCRBY 命令。

如果键 key 储存的值不能被解释为数字, 那么 INCRBY 命令将返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

127.0.0.1:6379> set rank 50
OK
127.0.0.1:6379> incrby rank 20
(integer) 70
127.0.0.1:6379> get rank
"70"
127.0.0.1:6379> exists counter
(integer) 0
127.0.0.1:6379> incrby couonter 30
(integer) 30
127.0.0.1:6379> get counter
(nil)
127.0.0.1:6379> get couonter
"30"

INCRBYFLOAT

为键 key 储存的值加上浮点数增量 increment

如果键 key 不存在, 那么 INCRBYFLOAT 会先将键 key 的值设为 0 , 然后再执行加法操作。

127.0.0.1:6379> get decimal
(nil)
127.0.0.1:6379> incrbyfloat decimal 2.56
"2.56"
127.0.0.1:6379> get decimal
"2.56"

DECR

为键 key 储存的数字值减去一。

如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 DECR 操作。

如果键 key 储存的值不能被解释为数字, 那么 DECR 命令将返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

127.0.0.1:6379> set fail_times 10
OK
127.0.0.1:6379> decr fail_times
(integer) 9
127.0.0.1:6379> exists count
(integer) 0
127.0.0.1:6379> decr count
(integer) -1
127.0.0.1:6379> get count
"-1"

DECRBY

将键 key 储存的整数值减去减量 decrement

如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 DECRBY 命令。

如果键 key 储存的值不能被解释为数字, 那么 DECRBY 命令将返回一个错误。

127.0.0.1:6379> set count 100
OK
127.0.0.1:6379> decrby count 20
(integer) 80
127.0.0.1:6379> exists pages
(integer) 0
127.0.0.1:6379> decrby pages 10
(integer) -10
127.0.0.1:6379> get pages
"-10"

MSET

同时为多个键设置值。

如果某个给定键已经存在, 那么 MSET 将使用新值去覆盖旧值, 如果这不是你所希望的效果, 请考虑使用 MSETNX 命令, 这个命令只会在所有给定键都不存在的情况下进行设置。

MSET 是一个原子性(atomic)操作, 所有给定键都会在同一时间内被设置, 不会出现某些键被设置了但是另一些键没有被设置的情况。

127.0.0.1:6379> mset date "2020.5.31" time "09:40 a.m." weather "sunny"
OK
127.0.0.1:6379> mget date time weather
1) "2020.5.31"
2) "09:40 a.m."
3) "sunny"
127.0.0.1:6379> 
127.0.0.1:6379> mset k1 k2
OK
127.0.0.1:6379> mset k1 "good" k2 "byte"
OK
127.0.0.1:6379> mget k1 k2
1) "good"
2) "byte"

MSETNX

当且仅当所有给定键都不存在时, 为所有给定键设置值。

即使只有一个给定键已经存在, MSETNX 命令也会拒绝执行对所有键的设置操作。

MSETNX 是一个原子性(atomic)操作, 所有给定键要么就全部都被设置, 要么就全部都不设置, 不可能出现第三种状态。

MGET

返回给定的一个或多个字符串键的值。

如果给定的字符串键里面, 有某个键不存在, 那么这个键的值将以特殊值 nil 表示。