0%

引言

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