Redis 的命令详解 - String 篇

1,641 阅读8分钟

相关文章

Redis 的命令详解 - Key 篇
Redis 的命令详解 - Hash 篇
Redis 的命令详解 - List 篇
Redis 的命令详解 - SET 篇
Redis 的命令详解 - Sorted Set 篇

String 命令详解

跟 String 相关的命令一共有 24 种,这里只介绍常用的。想查看全部命令请参考官网

SET : 添加一个键值对

起始版本:1.0.0
时间复杂度:O(1) 假设附加值很小,并且已经存在的值具有任意大小,则摊销时间复杂度为O(1),因为Redis使用的动态字符串库会使每个重新分配上的可用空间加倍。

SET 执行时,如果 key 已存在,无论其 value 是什么类型,value 都会被覆盖,先前与 key 关联的生存时间将被丢弃。

语法

SET key value [EX 秒|PX 毫秒] [NX|XX]

可选参数 从Redis 2.6.12开始,SET支持一下选项

  • EX 秒 : 设置生存时间,以秒为单位
  • PX 毫秒 : 设置生存时间,以毫秒为单位
  • NX : key 不存在时才添加
  • XX : key 存在时才添加

注意:由于 SET 命令的选项可以替换 SETNX、SETEX、PSETEX,因此在 Redis 的未来版本中,这三个命令可能会被弃用并最终删除。

返回值

  • 如果没有满足 NX 或 XX 的条件导致 set 命令没有执行,返回 null
  • set 成功,返回ok

MSET : 批量添加键值对

起始版本:1.0.1
时间复杂度:O(N),其中N是要设置的键值对数量

将给定的 key 设置其各自的 value
与常规 SET 一样,MSET 用新 value 替换旧 value。如果您不想覆盖现有值,请使用 MSETNX

MSET 是原子性操作,所有的键值对都是同时set的。客户端不会看到某些键值对已经set 而某些键值对还没有set

语法

MSET key1 value1 [key2 value2...]

返回值

  • 总是OK,因为MSET不会失败。

MSETNX : 安全批量添加键值对

起始版本:1.0.1
时间复杂度:O(N),其中N是要设置的键值对数量

将给定的 key 设置其各自的 value
MSET 不同,只要有一个 key 已存在,所有的键值对都不会被 set。由于这种特性,MSETNX 可以实现要么所有的操作都成功,要么所有的操作都失败。

MSETNX 也是原子性的,set 时,所有的键值对都是同时set的。客户端不会看到某些键值对已经set 而某些键值对还没有set

语法

MSETNX key1 value1 [key2 value2 ...]

返回值

  • 1 : 所有键值对都添加成功
  • 0 : 所有键值对都添加失败

SETRANGE : 覆盖 key 对应 vlue 的部分字符

起始版本:2.2.0
时间复杂度:O(1)

SETRANGE 的作用是覆盖 key 对应的 value 的一部分,从指定的下标开始覆盖, 覆盖的长度为指定的字符串的长度。
如果下标超过 value 最大下标,则在 value 末尾追加字符串。
不存在的 keys 被认为是空字符串("")。

注意,下标最大可以是 2^29-1=536870911 ,因为 redis 字符串限制在 512M 大小。如果你需要超过这个大小,你可以用多个keys。

警告:当 SETRANGE 从最后一个字节开始 set 时,如果 key 不存在,或者 value 是个比较小的字符串时,Redis需要立即分配内存来满足 set 后的总长度,这有可能会导致服务阻塞一会而,但是阻塞时间不会很长。 在一台 2010MacBook Pro 上,set 536870911字节(分配512MB)需要~300ms,set 134217728字节(分配128MB)需要~80ms,set 33554432比特位(分配32MB)需要~30ms,set 8388608比特(分配8MB)需要8ms。 注意,一旦第一次内存分配完,后面对同一个key调用 SETRANGE 就不会预先得到内存分配。

语法

SETRANGE key 下标 value

  • 下标从 0 开始
  • 包含下标本身
  • 不能使用负下标

返回值

修改后的字符串长度

应用

有了SETRANGEGETRANGE 命令,你可以把 Redis 的字符串当成线性数组,随机访问,时间复杂度只有O(1)。这在很多真实场景应用里非常快和高效。

GETSET : 设置 key 的 value 并返回旧 value

起始版本:1.0.0
时间复杂度:O(1)

设置 key 为新 value,并返回旧 value,该操作是原子性的

语法

GETSET key value

返回值

  • 如果 key 不存在,返回 null
  • 如果 value 不是 string 类型,返回错误
  • 成功,则返回旧 value

APPEND : 给 value 追加字符

起始版本:2.0.0
时间复杂度:O(1) 。假设附加值很小,并且已经存在的值具有任意大小,则摊销时间复杂度为O(1) ,因为Redis使用的动态字符串库会使每个重新分配上的可用空间加倍。

  • 如果 key 已经存在,并且在 value字符串类型APPEND 命令将在 value 的末尾追加字符。
  • 如果 key 已经存在,但 value 不是字符串类型APPEND 命令会报错
  • 如果 key 不存在,则创建。此时,作用类似于SET。

语法

APPEND key 字符串

返回值

追加后,value 的长度

GET : 获取一个key的value

起始版本:1.0.0
时间复杂度:O(1)

语法

GET key

返回值

  • 如果 key 不存在,返回 nil
  • 如果 value 不是 string 类型, 返回错误
  • 正常情况,返回 value

MGET : 获取多个 key 的 value

起始版本:1.0.0
时间复杂度:O(N),其中N是 key 的数目。

语法

MGET key1 [key2...]

返回值

  • 如果 key 不存在,返回 nil
  • 如果 value 不是 string 类型, 返回错误
  • 正常情况,返回 value 列表
redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)

GETRANGE : 获取一个key的value的子串

起始版本:2.4.0
时间复杂度:O(N),N是字符串长度,复杂度由最终返回长度决定,但由于通过一个字符串创建子字符串是很容易的,它可以被认为是O(1)。

警告:这个命令改过名字,在小于2.0的Redis版本中叫SUBSTR。 

语法

GETRANGE key 开始下标 结束下标

下标从0开始,包括开始下标,也包括结束下标

可以使用负数下标。比如 -1 表示倒数第一个

返回值

  • 如果 key 不存在,返回 nil
  • 如果 value 不是 string 类型, 返回错误
  • 正常情况,返回子串

STRLEN : 获取 key 对应 value 的字符串长度

起始版本:2.2.0
时间复杂度:O(1)

语法

STRLEN key

返回值

  • 字符串的长度
  • 0,key不存在, 或者 value 为 ""
  • 错误,当 value 不是 string 类型时

INCR : 给 value 加 1

起始版本:1.0.0
时间复杂度:O(1)

key 对应的 value 加一。

  • 如果 key 不存在,则创建 key 并设置 value 为 0 后,在加 1。
  • 如果 value 值不能转换成整数(比如 value 是 hash 类型、value 是 “ABC”、value 为 1.5),则返回错误。

此操作仅限于64位带符号整数。

注意:这是一个字符串操作,因为Redis没有专用的整数类型。存储在key处的字符串被解释为以10进制的64位带符号整数来执行该操作。

语法

INCR key

返回值

加后的值

INCRBY : 给 value 加上一个整数

起始版本:1.0.0
时间复杂度:O(1)

key 对应的 value 加上一个整数。

  • 如果 key 不存在,则创建 key 并设置 value 为 0 后,在加上设置的整数。
  • 如果 value 值不能转换成整数(比如 value 是 hash 类型、value 是 “ABC”、value 为 1.5),则返回错误。

此操作仅限于64位带符号整数。

语法

INCRBY key 整数

返回值

加后的值

INCRBYFLOAT : 给 value 加上一个数(可以是浮点数)

起始版本:2.6.0
时间复杂度:O(1)

key 对应的 value 加上一个数(可以是浮点数)。

  • 如果 key 不存在,则创建 key 并设置 value 为 0 后,在加上设置的数(可以是浮点数)。
  • 如果 value 值不能转换成数(可以是浮点数)(比如 value 是 hash 类型、value 是 “ABC”),则返回错误。

语法

INCRBYFLOAT key 数

返回值

加后的值。不管原始值是多少,也不管加的值是多少,最终结果最多只会保留小数点后17位,因此精度可能会有损失。

DECR : 给 value 减 1

起始版本:1.0.0
时间复杂度:O(1)

key 对应的 value 减一。

  • 如果 key 不存在,则创建 key 并设置 value 为 0 后,在减 1。
  • 如果 value 值不能转换成整数(比如 value 是 hash 类型、value 是 “ABC”、value 为 1.5),则返回错误。

此操作仅限于64位带符号整数。

语法

DECR key

返回值

减后的值

DECRBY : 给 value 减去一个整数

起始版本:1.0.0
时间复杂度:O(1)

key 对应的 value 减去一个整数。

  • 如果 key 不存在,则创建 key 并设置 value 为 0 后,在减去设置的整数。
  • 如果 value 值不能转换成整数(比如 value 是 hash 类型、value 是 “ABC”、value 为 1.5),则返回错误。

此操作仅限于64位带符号整数。

语法

DECRBY key 整数

返回值

减后的值