Redis 的命令详解 - String 篇
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 开始
- 包含下标本身
- 不能使用负下标
返回值
修改后的字符串长度
应用
有了SETRANGE
和 GETRANGE
命令,你可以把 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 整数
返回值
减后的值