引言
本文主要用于汇总 Redis 中常用的命令以及它们所对应的时间复杂度,有助于我们掌握不同命令的使用场景以及注意事项。
命令分类
Redis 命令大致分为以下集中:
- 服务端命令
 - 客户端命令
 - 键命令
 - 数据类型命令
 - 功能应用命令
 
本文主要介绍键命令及数据类型命令。
时间复杂度
O(1) < O(log n) < O(n) < O(nlog n) < O(n^2) < O(n^3) < O(n!) < O(n^n)
键(Key)命令
Redis 采用 key-value 的基本数据结构,任何二进制序列都可以作为 Redis 的 key 使用。设计 key 时不应该过长,过长的 key 不仅会消耗更多的内存,还会导致查找的效率降低。另外,Redis 允许的最大 key 长度为 512MB(value 最大长度同为 512MB)。
| 命令 | 时间复杂度 | 说明 | 
|---|---|---|
| DEL | O(N) | 若键存在的情况下,该命令用于删除键 | 
| EXISTS | O(1) | 用于检查键是否存在,若存在则返回 1,否则返回 0 | 
| EXPIRE | O(1) | 设置键的过期时间,单位:秒 | 
| PEXPIRE | O(1) | 设置键的过期时间,单位:毫秒 | 
| EXPIREAT | O(1) | 与 EXPIRE 类似,不同在于它的时间参数值采用的是时间戳的格式 | 
| KEYS | O(N) | 用于查找与指定 pattern 匹配的 key | 
| MOVE | O(1) | 将当前数据库中的 key 移动到指定的数据库中 | 
| PERSIST | O(1) | 用于删除 key 的过期时间 | 
| RANDOMKEY | O(1) | 从当前数据库中随机返回一个 key | 
| RENAME | O(1) | 修改 key 的名称 | 
| SCAN | 增量式迭代命令每次执行的复杂度为 O(1) , 对数据集进行一次完整迭代的复杂度为 O(N) , 其中 N 为数据集中的元素数量 | 基于游标的迭代器,用于迭代数据库中存在的所有键 | 
| TTL | O(1) | 用于检查 key 还剩多长时间过期,单位:秒。key 不存在时返回 -2;未设置过期时间时返回 -1 | 
| TYPE | O(1) | 用于获取 value 的数据类型 | 
String
String 是 Redis 的基础数据类型,Redis 中没有 int、float、boolean 等数据类型,所有的基本数据类型都是以 String 体现的。
| 命令 | 时间复杂度 | 说明 | 
|---|---|---|
| APPEND | O(1) | 用于将 value 追加到 key 所存储值的末尾 | 
| BITCOUNT | O(N) | 用于计算字符串中,被设置为 1 的比特位的数量 | 
| DECR | O(1) | 将 key 所存储的整数值减 1 | 
| DECRBY | O(1) | 将 key 所存储的值减去给定的递减值 | 
| GET | O(1) | 用于检索指定的值 | 
| GETBIT | O(1) | 对 key 所存储的字符串值,获取其指定偏移量上的位(bit) | 
| GETRANGE | O(N) | 返回 key 中字符串值的子字符 | 
| GETSET | O(1) | 将给定 key 的值设置为 value,并返回 key 的旧值 | 
| INCR | O(1) | 将 key 所存储的值加 1 | 
| INCRBY | O(1) | 将 key 所存储的值加上给定的递增值 | 
| INCRBYFLOAT | O(1) | 将 key 所存储的值加上指定的浮点递增值 | 
| MGET | O(N) | 一次性获取一个或者多个 key 所存储的值 | 
| MSET | O(N) | 用于同时设置多个键值对 | 
| MSETNX | O(N) | 当指定的 key 都不存在时,用于设置多个键值对 | 
| SET | O(1) | 用于设定指定 key 的值 | 
| SETBIT | O(1) | 对 key 所存储的字符串值,设置或清除指定偏移量上的位(bit) | 
| SETEX | O(1) | 将 value 存储到 key 中,并将 key 的过期时间设置为指定的值,单位:秒 | 
| STRLEN | O(1) | 返回 key 所存储的字符串值的长度 | 
| SETNX | O(1) | 当 key 不存在时,设置 key 的值 | 
| SETRANGE | O(1) | 从偏移量 offset 开始,使用指定的 value 覆盖 key 所存储的部分字符串的值 | 
List
List 是 Redis 中最常用数据类型之一。Redis 提供了诸多用于操作列表类型的命令,通过这些命令你可以实现将一个元素添加到列表的头部,或者尾部等诸多操作。
| 命令 | 时间复杂度 | 说明 | 
|---|---|---|
| BLPOP | O(1) | 用于删除并返回列表中的第一个元素(头部操作),如果列表中没有元素,就会发生阻塞,直到列表等待超时或发现可弹出元素为止 | 
| BRPOP | O(1) | 用于删除并返回列表中的最后一个元素(尾部操作),如果列表中没有元素,就会发生阻塞,直到列表等待超时或发现可弹出元素为止 | 
| BRPOPLPUSH | O(1) | 从列表中取出最后一个元素,并插入到另一个列表的头部。如果列表中没有元素,就会发生阻塞,直到等待超时或发现可弹出元素时为止 | 
| LINDEX | O(N) | 通过索引获取列表中的元素 | 
| LINSERT | O(N) | 指定列表中一个元素在它之前或之后插入另外一个元素 | 
| LLEN | O(1) | 用于获取列表的长度 | 
| LPOP | O(1) | 从列表的头部弹出元素,默认为第一个元素 | 
| LPUSH | O(1) | 在列表头部插入一个或者多个值 | 
| LPUSHX | O(1) | 当储存列表的 key 存在时,用于将值插入到列表头部 | 
| LRANGE | O(S+N), S 为偏移量 start , N 为指定区间内元素的数量 | 获取列表指定范围内的元素 | 
| LREM | O(N) | 用于从列表中删除元素与 value 相等的元素。count 表示删除的数量,为 0 表示全部移除 | 
| LSET | 对头元素或尾元素进行 LSET 操作,复杂度为 O(1)。其他情况下,为 O(N), N 为列表的长度 | 表示通过其索引设置列表中元素的值 | 
| LTRIM | O(N) | 保留列表中指定范围内的元素值 | 
Set
Redis set 数据类型由键值对组成,这些键值对具有无序、唯一的性质。
| 命令 | 时间复杂度 | 说明 | 
|---|---|---|
| SADD | O(N) | 向集合中添加一个或者多个元素,并且自动去重 | 
| SCARD | O(1) | 返回集合中元素的个数 | 
| SDIFF | O(N) | 求两个或对多个集合的差集 | 
| SDIFFSTORE | O(N) | 求两个集合或多个集合的差集,并将结果保存到指定的集合(key)中 | 
| SINTER | O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数 | 求两个或多个集合的交集 | 
| SINTERSTORE | O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数 | 求两个或多个集合的交集,并将结果保存到指定的集合(key)中 | 
| SMEMBERS | O(N) | 查看集合中所有元素 | 
| SMOVE | O(1) | 将集合中的元素移动到指定的集合中 | 
| SPOP | O(1) | 移除并返回集合中的一个随机元素 | 
| SRANDMEMBER | 只提供 key 参数时为 O(1) 。如果提供了 count 参数,那么为 O(N) ,N 为返回数组的元素个数 | 随机从集合中返回指定数量的元素,默认返回 1 个 | 
| SREM | O(N) | 删除一个或者多个元素,若元素不存在则自动忽略 | 
| SUNION | O(N),N 是所有给定集合的成员数量之和 | 求两个或者多个集合的并集 | 
| SUNIONSTORE | O(N), N 是所有给定集合的成员数量之和 | 求两个或者多个集合的并集,并将结果保存到指定的集合(key)中 | 
Zset
zset 是 Redis 提供的最具特色的数据类型之一,首先它是一个 set,这保证了内部 value 值的唯一性,其次它给每个 value 添加了一个 score(分值)属性,通过对分值的排序实现了有序化。
| 命令 | 时间复杂度 | 说明 | 
|---|---|---|
| ZADD | O(M*log(N)), N 是有序集的基数, M 为成功添加的新成员的数量 | 用于将一个或多个成员添加到有序集合中,或者更新已存在成员的 score 值 | 
| ZCARD | O(1) | 获取有序集合中成员的数量 | 
| ZCOUNT | O(log(N)), N 为有序集的基数 | 用于统计有序集合中指定 score 值范围内的元素个数 | 
| ZINCRBY | O(log(N)) 为有序集 key 的成员 member 的 score 值加上增量 increment | 用于增加有序集合中成员的分值 | 
| ZINTERSTORE | O(NK)+O(Mlog(M)), N 为给定 key 中基数最小的有序集, K 为给定有序集的数量, M 为结果集的基数 | 求两个或者多个有序集合的交集,并将所得结果存储在新的 key 中 | 
| ZRANGE | O(log(N)+M) | 返回有序集合中指定索引区间内的成员数量 | 
| ZRANGEBYLEX | O(log(N)+M) | 返回有序集中指定字典区间内的成员数量 | 
| ZRANGEBYSCORE | O(log(N)+M), N 为有序集的基数, M 为被结果集的基数 | 返回有序集合中指定分数区间内的成员 | 
| ZRANK | O(log(N)) 返回有序集 key 中成员 member 的排名 | 返回有序集合中指定成员的排名 | 
| ZREM | O(M*log(N)), N 为有序集的基数, M 为被成功移除的成员的数量 | 移除有序集合中的一个或多个成员 | 
| ZREMRANGEBYRANK | O(log(N)+M), N 为有序集的基数,而 M 为被移除成员的数量 | 移除有序集合中指定排名区间内的所有成员 | 
| ZREMRANGEBYSCORE | O(log(N)+M), N 为有序集的基数,而 M 为被移除成员的数量 | 移除有序集合中指定分数区间内的所有成员 | 
| ZREVRANGE | O(log(N)+M), N 为有序集的基数,而 M 为结果集的基数 | 返回有序集中指定区间内的成员,通过索引,分数从高到低 | 
| ZREVRANK | O(log(N)) 返回有序集 key 中成员 member 的排名 | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 | 
| ZSCORE | O(1) | 返回有序集中,指定成员的分数值 | 
| ZUNIONSTORE | O(N)+O(M log(M)), N 为给定有序集基数的总和, M 为结果集的基数 | 求两个或多个有序集合的并集,并将返回结果存储在新的 key 中 |