引言
本文主要用于汇总 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 中 |