Redis 命令全解析:深入探索键值存储的瑞士军刀
引言
Redis (Remote Dictionary Server) 是一个开源的、使用 ANSI C 语言编写的、支持网络、基于内存亦可持久化的键值(Key-Value)存储数据库,通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)、位图(Bitmap)、HyperLogLog、地理空间(Geospatial)索引半径查询以及流(Stream)等类型。凭借其极高的性能、丰富的数据结构、原子性操作以及对多种高级功能(如发布/订阅、事务、Lua 脚本、持久化、集群等)的支持,Redis 在缓存、消息队列、排行榜、计数器、实时分析、地理空间服务等众多场景中得到了广泛应用。
掌握 Redis 的核心在于理解和熟练运用其提供的各种命令。这些命令构成了与 Redis 服务器交互的语言。本文旨在全面梳理 Redis 的常用及重要命令,按照数据类型和功能进行分类,并提供详细的说明,帮助开发者深入理解 Redis 的能力,从而更高效地利用它构建强大的应用程序。
Redis 命令基本结构
Redis 命令通常遵循一个简单的结构:
COMMAND key [argument [argument ...]]
COMMAND
: 命令的名称,不区分大小写,但通常推荐使用大写。key
: 操作的目标键名。许多命令是针对特定键操作的。[argument [argument ...]]
: 命令所需的参数,数量和类型因命令而异。
一、 键(Keys)管理命令
这类命令不针对特定的数据类型,而是用于管理 Redis 数据库中的键本身。
-
KEYS pattern
: 查找所有符合给定模式pattern
的键。- 说明:
pattern
支持通配符,*
匹配任意数量的任意字符,?
匹配单个任意字符,[]
匹配括号内的任意一个字符。 - 警告:
KEYS
命令会遍历整个键空间,在生产环境中,如果键的数量非常庞大,执行此命令可能会阻塞服务器,严重影响性能。应谨慎使用,优先考虑SCAN
命令。 - 复杂度: O(N),N 为数据库中的键数量。
- 返回值: 包含匹配键名的列表(Array)。
- 说明:
-
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
: 增量迭代键空间。- 说明:
SCAN
是一个基于游标的迭代器,用于逐步遍历键空间,避免了KEYS
的阻塞问题。每次调用返回一个新的游标cursor
和一部分键。当返回的cursor
为 “0” 时,表示迭代完成。 MATCH pattern
: 可选,只返回匹配模式的键。COUNT count
: 可选,提示每次迭代返回的元素数量(仅为建议值,实际数量可能不同)。TYPE type
: 可选(Redis 6.0+),只返回指定类型的键。- 复杂度: 每次调用 O(1),完成整个迭代 O(N)。
- 返回值: 一个包含两个元素的数组:第一个是下一次迭代的游标,第二个是本次迭代返回的键列表。
- 说明:
-
EXISTS key [key ...]
: 检查一个或多个键是否存在。- 说明:判断给定的键是否存在于数据库中。
- 复杂度: O(1) per key.
- 返回值: 存在的键的数量(Integer)。
-
DEL key [key ...]
: 删除一个或多个键。- 说明:如果键存在,则删除该键及其关联的值。不存在的键会被忽略。
- 复杂度: O(1) per key for String, List, Set, Hash, ZSet. O(N) where N is the number of keys given in the worst case.
- 返回值: 被成功删除的键的数量(Integer)。
-
UNLINK key [key ...]
: 异步删除一个或多个键。- 说明:与
DEL
类似,但UNLINK
会将键的删除操作放到后台线程执行(如果值的清理成本较高,如巨大的集合或列表),从而避免阻塞主线程。对于小的值,其行为与DEL
几乎无异。推荐在可能删除大键时使用。 - 复杂度: O(1) per key to mark for deletion. Actual reclamation is asynchronous.
- 返回值: 被标记为删除的键的数量(Integer)。
- 说明:与
-
TYPE key
: 返回键所储存的值的数据类型。- 说明:可以得知一个键存储的是 String, List, Set, ZSet, Hash, Stream 还是其他类型。
- 复杂度: O(1).
- 返回值: 字符串表示的数据类型(”string”, “list”, “set”, “zset”, “hash”, “stream”)或 “none”(键不存在)。
-
EXPIRE key seconds
: 为键设置生存时间(TTL, Time To Live),单位为秒。- 说明:当键的生存时间到期时,键会被自动删除。
- 复杂度: O(1).
- 返回值: 1 如果成功设置;0 如果键不存在或无法设置。
-
PEXPIRE key milliseconds
: 为键设置生存时间,单位为毫秒。- 说明:与
EXPIRE
类似,但精度更高。 - 复杂度: O(1).
- 返回值: 1 或 0。
- 说明:与
-
EXPIREAT key timestamp
: 为键设置绝对过期时间戳(Unix timestamp),单位为秒。- 说明:键将在指定的时间点过期。
- 复杂度: O(1).
- 返回值: 1 或 0。
-
PEXPIREAT key milliseconds-timestamp
: 为键设置绝对过期时间戳,单位为毫秒。- 说明:与
EXPIREAT
类似,精度为毫秒。 - 复杂度: O(1).
- 返回值: 1 或 0。
- 说明:与
-
TTL key
: 获取键的剩余生存时间,单位为秒。- 说明:查看键还能存活多久。
- 复杂度: O(1).
- 返回值: 键的剩余秒数(Integer);-1 表示键存在但没有设置过期时间;-2 表示键不存在。
-
PTTL key
: 获取键的剩余生存时间,单位为毫秒。- 说明:
TTL
的毫秒版本。 - 复杂度: O(1).
- 返回值: 键的剩余毫秒数(Integer);-1 或 -2。
- 说明:
-
PERSIST key
: 移除键的过期时间,使其永不过期。- 说明:将一个设置了 TTL 的键变回永久存储。
- 复杂度: O(1).
- 返回值: 1 如果成功移除过期时间;0 如果键不存在或本身就没有设置过期时间。
-
RENAME key newkey
: 重命名键。- 说明:如果
newkey
已经存在,其原来的值将被覆盖。 - 复杂度: O(1).
- 返回值: 简单字符串 “OK”。
- 说明:如果
-
RENAMENX key newkey
: 仅当newkey
不存在时,重命名键。- 说明:原子操作,用于安全地重命名,避免覆盖已有键。
- 复杂度: O(1).
- 返回值: 1 如果重命名成功;0 如果
newkey
已存在。
-
RANDOMKEY
: 从当前数据库中随机返回一个键名。- 说明:用于随机抽样。
- 复杂度: O(1).
- 返回值: 随机键名(Bulk String)或
nil
(数据库为空)。
-
MOVE key db
: 将当前数据库的键移动到指定的数据库db
中。- 说明:Redis 支持多个数据库(默认 0-15)。此命令用于在数据库间移动键。
- 复杂度: O(1).
- 返回值: 1 如果移动成功;0 如果键不存在或目标数据库已有同名键。
-
DBSIZE
: 返回当前数据库的键的总数。- 说明:快速获取当前选中数据库的大小。
- 复杂度: O(1).
- 返回值: 键的数量(Integer)。
-
FLUSHDB [ASYNC|SYNC]
: 删除当前数据库中的所有键。- 说明:非常危险的操作,会清空当前选择的数据库。
ASYNC
(Redis 4.0+)选项表示异步删除,不阻塞服务器。SYNC
是默认行为。 - 复杂度: O(N),N 为键数量。ASYNC 模式下主线程复杂度低。
- 返回值: 简单字符串 “OK”。
- 说明:非常危险的操作,会清空当前选择的数据库。
-
FLUSHALL [ASYNC|SYNC]
: 删除所有数据库中的所有键。- 说明:比
FLUSHDB
更危险,会清空整个 Redis 实例的所有数据。同样支持ASYNC
和SYNC
。 - 复杂度: O(N),N 为所有数据库键总数。
- 返回值: 简单字符串 “OK”。
- 说明:比
二、 字符串(String)类型命令
字符串是 Redis 最基本的数据类型,可以存储文本、序列化对象或二进制数据,最大可达 512MB。
-
SET key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds|KEEPTTL]
: 设置键的值。- 说明:最常用的命令之一。
NX
: 只在键不存在时设置。XX
: 只在键已存在时设置。GET
: (Redis 6.2+)设置新值并返回旧值。EX
/PX
/EXAT
/PXAT
: 设置过期时间(秒/毫秒,相对/绝对)。KEEPTTL
: 保留键原有的 TTL。- 复杂度: O(1).
- 返回值: 通常是 “OK”;使用
GET
选项时返回旧值(Bulk String)或nil
。
-
GET key
: 获取键的值。- 说明:如果键不存在或值不是字符串类型,返回
nil
。 - 复杂度: O(1).
- 返回值: 键的值(Bulk String)或
nil
。
- 说明:如果键不存在或值不是字符串类型,返回
-
GETSET key value
: 设置键的新值,并返回旧值。- 说明:原子操作。如果键不存在,设置新值并返回
nil
。 - 复杂度: O(1).
- 返回值: 旧值(Bulk String)或
nil
。
- 说明:原子操作。如果键不存在,设置新值并返回
-
MSET key value [key value ...]
: 同时设置一个或多个键值对。- 说明:原子操作。
- 复杂度: O(N),N 为设置的键数量。
- 返回值: 总是 “OK”。
-
MGET key [key ...]
: 同时获取一个或多个键的值。- 说明:原子操作。
- 复杂度: O(N),N 为获取的键数量。
- 返回值: 包含所有键值的列表(Array),对应键不存在则相应位置为
nil
。
-
APPEND key value
: 如果键已存在且值为字符串,将value
追加到末尾。- 说明:如果键不存在,等同于
SET key value
。 - 复杂度: O(1) (Amortized).
- 返回值: 追加后字符串的总长度(Integer)。
- 说明:如果键不存在,等同于
-
STRLEN key
: 返回键值的长度。- 说明:如果键不存在,返回 0。
- 复杂度: O(1).
- 返回值: 字符串长度(Integer)。
-
INCR key
: 将键的值(必须是整数)加 1。- 说明:原子操作。如果键不存在,先初始化为 0 再加 1。如果值不是整数,返回错误。
- 复杂度: O(1).
- 返回值: 执行加 1 后的新值(Integer)。
-
DECR key
: 将键的值(必须是整数)减 1。- 说明:原子操作。类似
INCR
。 - 复杂度: O(1).
- 返回值: 执行减 1 后的新值(Integer)。
- 说明:原子操作。类似
-
INCRBY key increment
: 将键的值(必须是整数)加上指定的整数increment
。- 说明:原子操作。
- 复杂度: O(1).
- 返回值: 增加
increment
后的新值(Integer)。
-
DECRBY key decrement
: 将键的值(必须是整数)减去指定的整数decrement
。- 说明:原子操作。
- 复杂度: O(1).
- 返回值: 减少
decrement
后的新值(Integer)。
-
INCRBYFLOAT key increment
: 将键的值(可以是整数或浮点数)加上指定的浮点数increment
。- 说明:原子操作。用于处理浮点数。
- 复杂度: O(1).
- 返回值: 增加
increment
后的新值(Bulk String)。
-
GETRANGE key start end
: 获取字符串值的子字符串。- 说明:
start
和end
是基于 0 的索引,可以是负数(表示从末尾开始计数)。 - 复杂度: O(N),N 为子字符串长度。
- 返回值: 子字符串(Bulk String)。
- 说明:
-
SETRANGE key offset value
: 用value
覆盖字符串值从offset
开始的部分。- 说明:如果
offset
超出当前长度,会自动用空字节 (\x00
) 填充。 - 复杂度: O(N),N 为
value
的长度。 - 返回值: 修改后字符串的总长度(Integer)。
- 说明:如果
-
SETBIT key offset value
: 设置或清除字符串值中指定offset
的位(bit)。- 说明:
value
只能是 0 或 1。用于位图操作。 - 复杂度: O(1).
- 返回值: 指定位在设置前的值(0 或 1)。
- 说明:
-
GETBIT key offset
: 获取字符串值中指定offset
的位。- 说明:用于位图操作。
- 复杂度: O(1).
- 返回值: 指定位的值(0 或 1)。
-
BITCOUNT key [start end]
: 计算字符串值中被设置为 1 的位的数量。- 说明:可以指定字节范围
[start end]
进行计算。 - 复杂度: O(N),N 为字符串长度。
- 返回值: 位为 1 的数量(Integer)。
- 说明:可以指定字节范围
-
BITPOS key bit [start] [end]
: 查找字符串中第一个值为bit
(0或1) 的位的位置。- 说明:可以指定字节范围
[start end]
进行查找。 - 复杂度: O(N).
- 返回值: 第一个匹配位的位置(Integer),或 -1(未找到)。
- 说明:可以指定字节范围
-
BITOP operation destkey key [key ...]
: 对一个或多个位图(字符串键)进行位运算(AND, OR, XOR, NOT),并将结果存储在destkey
中。- 说明:强大的位图聚合操作。
- 复杂度: O(N),N 为最长字符串的长度。
- 返回值: 结果字符串的长度(Integer)。
三、 哈希(Hash)类型命令
哈希是一个键值对集合,特别适合存储对象。每个哈希可以存储多达 2^32 – 1 个字段。
-
HSET key field value [field value ...]
: 设置哈希key
中一个或多个字段field
的值value
。- 说明:如果字段已存在,则覆盖旧值。如果键不存在,会创建一个新的哈希。在 Redis 4.0 之前,
HSET
一次只能设置一个字段。 - 复杂度: O(1) per field added.
- 返回值: 新添加到哈希的字段数量(Integer)(不包括更新的字段)。
- 说明:如果字段已存在,则覆盖旧值。如果键不存在,会创建一个新的哈希。在 Redis 4.0 之前,
-
HGET key field
: 获取哈希key
中指定字段field
的值。- 说明:如果字段或键不存在,返回
nil
。 - 复杂度: O(1).
- 返回值: 字段的值(Bulk String)或
nil
。
- 说明:如果字段或键不存在,返回
-
HMSET key field value [field value ...]
: (已废弃,请使用HSET
) 同时设置哈希key
中多个字段的值。- 说明:原子操作。Redis 4.0+ 推荐使用
HSET
代替。 - 复杂度: O(N),N 为设置的字段数量。
- 返回值: 简单字符串 “OK”。
- 说明:原子操作。Redis 4.0+ 推荐使用
-
HMGET key field [field ...]
: 同时获取哈希key
中一个或多个字段的值。- 说明:原子操作。
- 复杂度: O(N),N 为获取的字段数量。
- 返回值: 包含所有字段值的列表(Array),字段不存在则相应位置为
nil
。
-
HGETALL key
: 获取哈希key
中所有的字段和值。- 说明:返回一个包含字段和值的列表,字段名和值交替出现。
- 复杂度: O(N),N 为哈希中的字段数量。
- 返回值: 字段和值的列表(Array),或空列表(键不存在)。
-
HDEL key field [field ...]
: 删除哈希key
中的一个或多个指定字段。- 说明:忽略不存在的字段。
- 复杂度: O(1) per field deleted.
- 返回值: 成功删除的字段数量(Integer)。
-
HLEN key
: 获取哈希key
中字段的数量。- 说明:如果键不存在,返回 0。
- 复杂度: O(1).
- 返回值: 字段数量(Integer)。
-
HSTRLEN key field
: (Redis 3.2+) 获取哈希key
中指定字段field
的值的字符串长度。- 说明:如果字段或键不存在,返回 0。
- 复杂度: O(1).
- 返回值: 字段值的长度(Integer)。
-
HEXISTS key field
: 检查哈希key
中是否存在指定字段field
。- 说明:
- 复杂度: O(1).
- 返回值: 1 如果字段存在;0 如果字段或键不存在。
-
HKEYS key
: 获取哈希key
中所有的字段名。- 说明:
- 复杂度: O(N),N 为字段数量。
- 返回值: 包含所有字段名的列表(Array)。
-
HVALS key
: 获取哈希key
中所有的值。- 说明:
- 复杂度: O(N),N 为字段数量。
- 返回值: 包含所有值的列表(Array)。
-
HINCRBY key field increment
: 将哈希key
中字段field
的值(必须是整数)加上increment
。- 说明:原子操作。如果字段不存在,先初始化为 0 再增加。
- 复杂度: O(1).
- 返回值: 增加
increment
后的新值(Integer)。
-
HINCRBYFLOAT key field increment
: 将哈希key
中字段field
的值(可以是整数或浮点数)加上浮点数increment
。- 说明:原子操作。
- 复杂度: O(1).
- 返回值: 增加
increment
后的新值(Bulk String)。
-
HSCAN key cursor [MATCH pattern] [COUNT count]
: 增量迭代哈希key
中的字段和值。- 说明:类似
SCAN
,用于遍历大型哈希,避免阻塞。 - 复杂度: 每次调用 O(1),完成整个迭代 O(N)。
- 返回值: 一个包含两个元素的数组:第一个是下一次迭代的游标,第二个是本次迭代返回的字段和值列表(交替出现)。
- 说明:类似
四、 列表(List)类型命令
列表是简单的字符串列表,按照插入顺序排序。可以添加元素到列表的头部(左边)或尾部(右边)。列表非常适合实现消息队列、栈等。
-
LPUSH key element [element ...]
: 将一个或多个元素element
插入到列表key
的头部(左侧)。- 说明:如果键不存在,会创建一个空列表并执行插入。
- 复杂度: O(1) per element added.
- 返回值: 执行命令后列表的长度(Integer)。
-
RPUSH key element [element ...]
: 将一个或多个元素element
插入到列表key
的尾部(右侧)。- 说明:类似
LPUSH
。 - 复杂度: O(1) per element added.
- 返回值: 执行命令后列表的长度(Integer)。
- 说明:类似
-
LPUSHX key element [element ...]
: 仅当列表key
存在时,将元素插入到列表头部。- 说明:
- 复杂度: O(1) per element added.
- 返回值: 插入后列表的长度;如果键不存在,返回 0。
-
RPUSHX key element [element ...]
: 仅当列表key
存在时,将元素插入到列表尾部。- 说明:
- 复杂度: O(1) per element added.
- 返回值: 插入后列表的长度;如果键不存在,返回 0。
-
LPOP key [count]
: 移除并返回列表key
头部的元素。- 说明:如果指定
count
(Redis 6.2+),则移除并返回最多count
个元素。 - 复杂度: O(1) or O(N) where N is count.
- 返回值: 被移除的元素(Bulk String)或
nil
(列表为空);带count
时返回元素列表(Array)。
- 说明:如果指定
-
RPOP key [count]
: 移除并返回列表key
尾部的元素。- 说明:类似
LPOP
。 - 复杂度: O(1) or O(N) where N is count.
- 返回值: 被移除的元素(Bulk String)或
nil
;带count
时返回元素列表(Array)。
- 说明:类似
-
BLPOP key [key ...] timeout
: 阻塞式地从一个或多个列表的头部移除并返回第一个非空列表的元素。- 说明:
timeout
是阻塞超时时间(秒),0 表示无限期阻塞。用于实现可靠的消息队列消费者。 - 复杂度: O(1).
- 返回值: 一个包含两个元素的数组:第一个是弹出元素的来源键名,第二个是弹出的元素值;如果超时,返回
nil
。
- 说明:
-
BRPOP key [key ...] timeout
: 阻塞式地从一个或多个列表的尾部移除并返回第一个非空列表的元素。- 说明:类似
BLPOP
。 - 复杂度: O(1).
- 返回值: 同
BLPOP
。
- 说明:类似
-
RPOPLPUSH source destination
: (已废弃,请使用LMOVE
) 原子地从列表source
尾部移除一个元素,并将其插入到列表destination
的头部。- 说明:常用于创建安全的消息队列(处理中备份)。
- 复杂度: O(1).
- 返回值: 被移动的元素(Bulk String)或
nil
(source
为空)。
-
BRPOPLPUSH source destination timeout
: (已废弃,请使用BLMOVE
)RPOPLPUSH
的阻塞版本。- 说明:
- 复杂度: O(1).
- 返回值: 被移动的元素(Bulk String)或
nil
(超时)。
-
LMOVE source destination LEFT|RIGHT LEFT|RIGHT
: (Redis 6.2+) 原子地从source
列表的指定端(LEFT
或RIGHT
)弹出一个元素,并将其推入destination
列表的指定端(LEFT
或RIGHT
)。- 说明:更通用的原子移动命令,替代了
RPOPLPUSH
。例如LMOVE src dst RIGHT LEFT
等同于RPOPLPUSH src dst
。 - 复杂度: O(1).
- 返回值: 被移动的元素(Bulk String)或
nil
(source
为空)。
- 说明:更通用的原子移动命令,替代了
-
BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout
: (Redis 6.2+)LMOVE
的阻塞版本。- 说明:替代了
BRPOPLPUSH
。 - 复杂度: O(1).
- 返回值: 被移动的元素(Bulk String)或
nil
(超时)。
- 说明:替代了
-
LLEN key
: 获取列表key
的长度(元素数量)。- 说明:如果键不存在,返回 0。
- 复杂度: O(1).
- 返回值: 列表长度(Integer)。
-
LINDEX key index
: 获取列表key
中指定索引index
处的元素。- 说明:
index
是基于 0 的,负数表示从末尾计数(-1 是最后一个元素)。 - 复杂度: O(N),N 是到
index
的距离。 - 返回值: 指定索引的元素(Bulk String)或
nil
(索引超出范围)。
- 说明:
-
LSET key index element
: 设置列表key
中指定索引index
处的元素值为element
。- 说明:
index
必须在列表范围内。 - 复杂度: O(N),N 是到
index
的距离。 - 返回值: 简单字符串 “OK”;如果
index
超出范围或键不存在,返回错误。
- 说明:
-
LINSERT key BEFORE|AFTER pivot element
: 在列表key
中查找元素pivot
,并在其前(BEFORE
)或后(AFTER
)插入新元素element
。- 说明:如果
pivot
不存在或键不存在,不执行任何操作。 - 复杂度: O(N),N 为列表长度。
- 返回值: 插入后列表的长度;如果
pivot
未找到,返回 -1;如果键不存在,返回 0。
- 说明:如果
-
LRANGE key start stop
: 获取列表key
中指定范围内的元素。- 说明:
start
和stop
是基于 0 的索引,负数表示从末尾计数。LRANGE key 0 -1
返回整个列表。 - 复杂度: O(S+N),S 是起始偏移量,N 是返回元素数量。
- 返回值: 包含指定范围内元素的列表(Array)。
- 说明:
-
LTRIM key start stop
: 修剪(Trim)列表key
,只保留指定范围内的元素。- 说明:
start
和stop
是基于 0 的索引。常用于保持列表只包含最新的 N 个元素。 - 复杂度: O(N),N 是被移除的元素数量。
- 返回值: 简单字符串 “OK”。
- 说明:
-
LREM key count element
: 从列表key
中移除前count
个值等于element
的元素。- 说明:
count > 0
: 从头向尾移除。count < 0
: 从尾向头移除。count = 0
: 移除所有匹配的元素。
- 复杂度: O(N),N 为列表长度。
- 返回值: 被移除的元素数量(Integer)。
- 说明:
五、 集合(Set)类型命令
集合是字符串的无序集合,不允许重复成员。适合存储唯一项,并支持高效的成员检查和集合运算。
-
SADD key member [member ...]
: 向集合key
添加一个或多个成员member
。- 说明:忽略已存在的成员。如果键不存在,会创建一个新集合。
- 复杂度: O(1) per member added.
- 返回值: 成功添加的新成员数量(Integer)(不包括已存在的成员)。
-
SREM key member [member ...]
: 从集合key
移除一个或多个成员member
。- 说明:忽略不存在的成员。
- 复杂度: O(1) per member removed.
- 返回值: 成功移除的成员数量(Integer)。
-
SMEMBERS key
: 获取集合key
中的所有成员。- 说明:返回的成员是无序的。
- 复杂度: O(N),N 为集合大小。
- 返回值: 包含所有成员的列表(Array)。
-
SISMEMBER key member
: 判断member
是否是集合key
的成员。- 说明:
- 复杂度: O(1).
- 返回值: 1 如果是成员;0 如果不是成员或键不存在。
-
SCARD key
: 获取集合key
的基数(成员数量)。- 说明:如果键不存在,返回 0。
- 复杂度: O(1).
- 返回值: 集合的基数(Integer)。
-
SPOP key [count]
: 随机移除并返回集合key
中的一个或多个成员。- 说明:如果指定
count
(Redis 3.2+),则移除并返回最多count
个随机成员。 - 复杂度: O(1) or O(N) where N is count.
- 返回值: 被移除的成员(Bulk String);带
count
时返回成员列表(Array);如果集合为空,返回nil
或空列表。
- 说明:如果指定
-
SRANDMEMBER key [count]
: 随机返回集合key
中的一个或多个成员,但不移除它们。- 说明:
count
> 0: 返回count
个不重复的随机成员(最多为集合大小)。count
< 0: 返回|count|
个可能重复的随机成员。
- 复杂度: O(1) or O(N) where N is count.
- 返回值: 随机成员(Bulk String)或成员列表(Array);如果集合为空,返回
nil
或空列表。
- 说明:
-
SMOVE source destination member
: 将成员member
从集合source
移动到集合destination
。- 说明:原子操作。如果
member
不在source
中,不执行任何操作。 - 复杂度: O(1).
- 返回值: 1 如果成功移动;0 如果
member
不在source
中。
- 说明:原子操作。如果
-
SUNION key [key ...]
: 计算一个或多个集合的并集。- 说明:返回所有集合中出现过的所有成员(去重)。
- 复杂度: O(N),N 是所有输入集合的总成员数。
- 返回值: 包含并集结果的列表(Array)。
-
SUNIONSTORE destination key [key ...]
: 计算一个或多个集合的并集,并将结果存储在destination
集合中。- 说明:如果
destination
已存在,会被覆盖。 - 复杂度: O(N).
- 返回值: 结果集合的基数(Integer)。
- 说明:如果
-
SINTER key [key ...]
: 计算一个或多个集合的交集。- 说明:返回同时存在于所有给定集合中的成员。
- 复杂度: O(N*M),N 是最小集合的大小,M 是集合数量。
- 返回值: 包含交集结果的列表(Array)。
-
SINTERSTORE destination key [key ...]
: 计算交集并存储结果。- 说明:
- 复杂度: O(N*M).
- 返回值: 结果集合的基数(Integer)。
-
SDIFF key [key ...]
: 计算第一个集合与后续所有集合的差集。- 说明:返回存在于第一个集合但不在任何后续集合中的成员。
- 复杂度: O(N),N 是所有输入集合的总成员数。
- 返回值: 包含差集结果的列表(Array)。
-
SDIFFSTORE destination key [key ...]
: 计算差集并存储结果。- 说明:
- 复杂度: O(N).
- 返回值: 结果集合的基数(Integer)。
-
SSCAN key cursor [MATCH pattern] [COUNT count]
: 增量迭代集合key
中的成员。- 说明:类似
SCAN
,用于遍历大型集合。 - 复杂度: 每次调用 O(1),完成整个迭代 O(N)。
- 返回值: 一个包含两个元素的数组:第一个是下一次迭代的游标,第二个是本次迭代返回的成员列表。
- 说明:类似
六、 有序集合(Sorted Set / ZSet)类型命令
有序集合与集合类似,也是字符串成员的集合,且不允许重复。但每个成员都会关联一个双精度浮点数 score
(分数)。Redis 通过分数来为集合中的成员进行排序。有序集合非常适合实现排行榜、范围查询等。
-
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
: 向有序集合key
添加一个或多个成员,或者更新已存在成员的分数。- 说明:
NX
: 只添加新成员,不更新已存在成员。XX
: 只更新已存在成员,不添加新成员。GT
: (Redis 6.2+) 只有当新分数大于当前分数时才更新。LT
: (Redis 6.2+) 只有当新分数小于当前分数时才更新。CH
: 返回值变为被修改的成员总数(包括添加和更新)。INCR
: 将成员的分数加上score
(此时ZADD
类似ZINCRBY
,但可以操作多个成员)。
- 复杂度: O(log N) per member added/updated (N 是 ZSet 大小).
- 返回值: 默认是新添加的成员数量(Integer);使用
CH
时是被修改的成员总数;使用INCR
时,如果是单个成员,返回其新分数(Bulk String),否则行为未定义。
- 说明:
-
ZREM key member [member ...]
: 从有序集合key
移除一个或多个成员。- 说明:忽略不存在的成员。
- 复杂度: O(log N) per member removed.
- 返回值: 成功移除的成员数量(Integer)。
-
ZSCORE key member
: 获取有序集合key
中成员member
的分数。- 说明:如果成员或键不存在,返回
nil
。 - 复杂度: O(1).
- 返回值: 成员的分数(Bulk String)或
nil
。
- 说明:如果成员或键不存在,返回
-
ZINCRBY key increment member
: 将有序集合key
中成员member
的分数增加increment
。- 说明:原子操作。如果成员不存在,会添加该成员,分数初始化为
increment
。 - 复杂度: O(log N).
- 返回值: 成员的新分数(Bulk String)。
- 说明:原子操作。如果成员不存在,会添加该成员,分数初始化为
-
ZCARD key
: 获取有序集合key
的基数(成员数量)。- 说明:如果键不存在,返回 0。
- 复杂度: O(1).
- 返回值: 集合的基数(Integer)。
-
ZCOUNT key min max
: 计算有序集合key
中,分数在[min, max]
区间内的成员数量。- 说明:
min
和max
可以是-inf
和+inf
。可以使用(
符号表示开区间,如(1 5
表示 (1, 5]。 - 复杂度: O(log N),N 为 ZSet 大小。
- 返回值: 指定分数区间的成员数量(Integer)。
- 说明:
-
ZRANGE key start stop [WITHSCORES]
: 按分数从低到高的顺序,返回有序集合key
中指定排名范围[start, stop]
内的成员。- 说明:
start
和stop
是基于 0 的排名索引,负数表示从末尾计数。WITHSCORES
选项会同时返回成员和分数。 - 复杂度: O(log N + M),M 是返回成员数量。
- 返回值: 成员列表(Array);如果带
WITHSCORES
,则是成员和分数交替的列表。
- 说明:
-
ZREVRANGE key start stop [WITHSCORES]
: 按分数从高到低的顺序,返回指定排名范围内的成员。- 说明:与
ZRANGE
相反。 - 复杂度: O(log N + M).
- 返回值: 同
ZRANGE
。
- 说明:与
-
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
: 按分数从低到高的顺序,返回有序集合key
中分数在[min, max]
区间内的成员。- 说明:
min
和max
可以是-inf
,+inf
,支持开区间(
。LIMIT
用于分页。 - 复杂度: O(log N + M).
- 返回值: 同
ZRANGE
。
- 说明:
-
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
: 按分数从高到低的顺序,返回分数在[min, max]
区间内的成员(注意参数顺序是max min
)。- 说明:与
ZRANGEBYSCORE
相反。 - 复杂度: O(log N + M).
- 返回值: 同
ZRANGE
。
- 说明:与
-
ZRANK key member
: 返回有序集合key
中成员member
的排名(按分数从低到高,排名从 0 开始)。- 说明:如果成员不存在,返回
nil
。 - 复杂度: O(log N).
- 返回值: 成员的排名(Integer)或
nil
。
- 说明:如果成员不存在,返回
-
ZREVRANK key member
: 返回成员member
的排名(按分数从高到低,排名从 0 开始)。- 说明:与
ZRANK
相反。 - 复杂度: O(log N).
- 返回值: 成员的排名(Integer)或
nil
。
- 说明:与
-
ZREMRANGEBYRANK key start stop
: 移除有序集合key
中指定排名范围[start, stop]
内的所有成员。- 说明:按分数从低到高排序的排名。
- 复杂度: O(log N + M),M 是被移除的成员数量。
- 返回值: 被移除的成员数量(Integer)。
-
ZREMRANGEBYSCORE key min max
: 移除有序集合key
中分数在[min, max]
区间内的所有成员。- 说明:支持开区间
(
。 - 复杂度: O(log N + M).
- 返回值: 被移除的成员数量(Integer)。
- 说明:支持开区间
-
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
: 计算一个或多个有序集合的并集,并将结果存入destination
。- 说明:可以为每个输入集合指定权重
WEIGHTS
,并定义分数聚合方式AGGREGATE
(默认 SUM)。 - 复杂度: O(N log N + M log M),N 是结果大小,M 是所有输入集合总大小。
- 返回值: 结果有序集合的基数(Integer)。
- 说明:可以为每个输入集合指定权重
-
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
: 计算交集并存储结果。- 说明:选项同
ZUNIONSTORE
。 - 复杂度: O(K log K + M log M),K 是最小输入集合大小,M 是所有输入集合总大小。
- 返回值: 结果有序集合的基数(Integer)。
- 说明:选项同
-
ZSCAN key cursor [MATCH pattern] [COUNT count]
: 增量迭代有序集合key
中的成员和分数。- 说明:类似
SCAN
,用于遍历大型有序集合。 - 复杂度: 每次调用 O(log N),完成整个迭代 O(N)。
- 返回值: 一个包含两个元素的数组:第一个是下一次迭代的游标,第二个是本次迭代返回的成员和分数列表(交替出现)。
- 说明:类似
-
ZPOPMAX key [count]
: (Redis 5.0+) 移除并返回有序集合key
中分数最高的count
个成员。- 说明:
count
默认为 1。 - 复杂度: O(log N * M),M 是移除数量。
- 返回值: 包含被移除成员及其分数的列表(Array),或空列表。
- 说明:
-
ZPOPMIN key [count]
: (Redis 5.0+) 移除并返回分数最低的count
个成员。- 说明:
- 复杂度: O(log N * M).
- 返回值: 同
ZPOPMAX
。
-
BZPOPMAX key [key ...] timeout
: (Redis 5.0+)ZPOPMAX
的阻塞版本。从多个有序集合中弹出分数最高的成员。- 说明:
- 复杂度: O(log N).
- 返回值: 一个包含三个元素的数组:来源键名、弹出的成员、成员的分数;超时返回
nil
。
-
BZPOPMIN key [key ...] timeout
: (Redis 5.0+)ZPOPMIN
的阻塞版本。- 说明:
- 复杂度: O(log N).
- 返回值: 同
BZPOPMAX
。
七、 HyperLogLog 类型命令
HyperLogLog 是一种概率性数据结构,用于以极小的内存消耗估算一个集合的基数(不重复元素的数量)。误差率约为 0.81%。
-
PFADD key element [element ...]
: 将一个或多个元素添加到指定的 HyperLogLog 结构中。- 说明:如果元素已存在,则不会改变内部状态。
- 复杂度: O(1) per element added.
- 返回值: 1 如果 HyperLogLog 的内部状态被修改;0 如果没有修改。
-
PFCOUNT key [key ...]
: 返回一个或多个 HyperLogLog 的并集的基数估算值。- 说明:计算单个 HLL 的基数时,只需提供一个
key
。 - 复杂度: O(1) for single key; O(N) for multiple keys where N is the number of keys (worst case related to merging sparse representations).
- 返回值: 基数的估算值(Integer)。
- 说明:计算单个 HLL 的基数时,只需提供一个
-
PFMERGE destkey sourcekey [sourcekey ...]
: 将一个或多个 HyperLogLog 合并到destkey
中。- 说明:合并后的
destkey
将包含所有源 HLL 的并集的基数信息。 - 复杂度: O(N),N 为 HLL 数量。
- 返回值: 简单字符串 “OK”。
- 说明:合并后的
八、 地理空间(Geospatial)类型命令
Redis 3.2+ 增加了对地理空间索引的支持,底层使用 Sorted Set 实现。可以存储地点的经纬度,并执行半径查询等操作。
-
GEOADD key longitude latitude member [longitude latitude member ...]
: 将一个或多个带有经纬度的地理空间位置(成员)添加到指定的key
中。- 说明:
longitude
经度,latitude
纬度,member
位置名称。 - 复杂度: O(log N) per item added.
- 返回值: 成功添加的新位置数量(Integer)。
- 说明:
-
GEOPOS key member [member ...]
: 获取一个或多个成员的位置(经度和纬度)。- 说明:如果成员不存在,返回
nil
。 - 复杂度: O(log N) per member requested.
- 返回值: 包含成员位置信息的列表(Array),每个位置是一个包含经纬度的数组,或
nil
。
- 说明:如果成员不存在,返回
-
GEODIST key member1 member2 [unit]
: 返回两个给定成员之间的距离。- 说明:
unit
可以是m
(米, 默认),km
(千米),mi
(英里),ft
(英尺)。 - 复杂度: O(log N).
- 返回值: 距离(Bulk String,浮点数)或
nil
(成员不存在)。
- 说明:
-
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
: 根据给定的经纬度,查询指定半径radius
内的所有成员。- 说明:功能强大,选项丰富。
WITHCOORD
: 返回成员的经纬度。WITHDIST
: 返回成员与中心点的距离。WITHHASH
: 返回成员的 Geohash 整数表示。COUNT count
: 限制返回结果数量。ASC|DESC
: 按距离升序或降序排序。STORE key
: 将结果(成员名)存储到指定的 ZSet (score 为距离)。STOREDIST key
: 将结果(成员名)存储到指定的 ZSet (score 为距离),但与STORE
冲突,效果类似。
- 复杂度: O(N + log M),N 是半径内的成员数,M 是 ZSet 总大小。
- 返回值: 成员列表(Array),具体内容取决于选项。
- 说明:功能强大,选项丰富。
-
GEORADIUSBYMEMBER key member radius m|km|ft|mi [options]
: 根据给定成员的位置,查询指定半径内的所有成员。- 说明:选项与
GEORADIUS
相同。相当于先用GEOPOS
获取成员位置,再调用GEORADIUS
。 - 复杂度: O(N + log M).
- 返回值: 同
GEORADIUS
。
- 说明:选项与
-
GEOHASH key member [member ...]
: 返回一个或多个成员的 Geohash 字符串表示。- 说明:Geohash 是一种将经纬度编码为字符串的方法。
- 复杂度: O(log N) per member.
- 返回值: 包含 Geohash 字符串的列表(Array),成员不存在则为
nil
。
九、 流(Stream)类型命令
Redis 5.0+ 引入了 Stream 数据类型,它是一个强大的、支持消费组的、仅追加的日志(append-only log)。非常适合实现消息队列、事件溯源等。
-
XADD key [MAXLEN|MINID [~] count] [*|id] field value [field value ...]
: 向流key
添加一条新消息(entry)。- 说明:
MAXLEN ~ count
: 限制流的最大长度,~
表示近似修剪。MINID ~ id
: 限制流中消息的最小 ID,~
表示近似修剪。*
: 由服务器自动生成 ID (timestamp-sequence)。id
: 手动指定 ID (格式: millisecondsTime-sequenceNumber)。field value
: 消息的内容,键值对形式。
- 复杂度: O(1).
- 返回值: 添加的消息的 ID(Bulk String)。
- 说明:
-
XRANGE key start end [COUNT count]
: 获取流key
中 ID 在[start, end]
范围内的消息。- 说明:
start
和end
可以是-
(最小ID),+
(最大ID), 或具体的 ID。 - 复杂度: O(log N + M),M 是返回数量。
- 返回值: 包含消息(ID 和字段值)的列表(Array)。
- 说明:
-
XREVRANGE key end start [COUNT count]
: 反向获取流中 ID 在[start, end]
范围内的消息。- 说明:参数顺序是
end start
。 - 复杂度: O(log N + M).
- 返回值: 同
XRANGE
。
- 说明:参数顺序是
-
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]
: 从一个或多个流中读取消息。- 说明:
COUNT
: 每个流最多读取count
条。BLOCK milliseconds
: 阻塞等待新消息,0 表示无限期。STREAMS key id
: 指定要读取的流和起始 ID($
表示只读新消息)。
- 复杂度: O(N) per stream where N is count, or O(1) when blocking.
- 返回值: 包含来自不同流的消息列表(Array);阻塞超时返回
nil
。
- 说明:
-
XLEN key
: 获取流key
中的消息数量。- 说明:
- 复杂度: O(1).
- 返回值: 消息数量(Integer)。
-
XTRIM key MAXLEN|MINID [~] count|id
: 修剪流,使其不超过指定长度或移除旧于指定 ID 的消息。- 说明:
- 复杂度: O(N),N 是删除数量。
- 返回值: 被删除的消息数量(Integer)。
-
XDEL key id [id ...]
: 从流中删除指定 ID 的消息(逻辑删除,空间不一定立即回收)。- 说明:
- 复杂度: O(1) per ID.
- 返回值: 成功删除的消息数量(Integer)。
-
XGROUP CREATE key groupname id|$ [MKSTREAM]
: 创建一个消费者组groupname
,关联到流key
。- 说明:
id
是起始消费 ID ($
表示从流末尾开始)。MKSTREAM
如果流不存在则创建。 - 复杂度: O(1).
- 返回值: “OK”。
- 说明:
-
XGROUP SETID key groupname id|$
: 设置消费者组的下一个待消费 ID。- 说明:
- 复杂度: O(1).
- 返回值: “OK”。
-
XGROUP DESTROY key groupname
: 销毁一个消费者组。- 说明:
- 复杂度: O(N),N 是组内待处理消息数。
- 返回值: 1 如果成功;0 如果组不存在。
-
XGROUP CREATECONSUMER key groupname consumername
: (Redis 6.2+) 在消费者组中注册一个消费者。- 说明:主要用于
XINFO
显示,XREADGROUP
会隐式创建。 - 复杂度: O(1).
- 返回值: 1 如果消费者是新创建的;0 如果已存在。
- 说明:主要用于
-
XGROUP DELCONSUMER key groupname consumername
: 从消费者组中删除一个消费者(同时删除其 Pending Entries List)。- 说明:
- 复杂度: O(N),N 是该消费者的 PEL 大小。
- 返回值: 该消费者拥有的待处理消息数量(Integer)。
-
XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] id [id ...]|>
: 通过消费者组读取消息。- 说明:
GROUP group consumer
: 指定组名和消费者名。id
:>
表示读取尚未传递给组内任何消费者的消息;或指定 ID 用于XCLAIM
后重新读取。NOACK
: 读取消息后不放入 Pending Entries List (PEL),无需XACK
。
- 复杂度: O(M) where M is count, or O(1) when blocking.
- 返回值: 同
XREAD
,但消息会进入 PEL (除非NOACK
)。
- 说明:
-
XACK key group id [id ...]
: 确认(Acknowledge)一条或多条已被消费者成功处理的消息。- 说明:将消息从 PEL 中移除。
- 复杂度: O(1) per ID.
- 返回值: 成功确认的消息数量(Integer)。
-
XPENDING key group [start end count] [consumer]
: 查看消费者组中待处理(Pending)的消息列表。- 说明:可以按 ID 范围、数量、特定消费者过滤。
- 复杂度: O(N) or O(log N + M).
- 返回值: 待处理消息的概要信息或详细列表(Array)。
-
XCLAIM key group consumer min-idle-time id [id ...] [IDLE ms] [TIME ms-unix-time] [RETRYCOUNT count] [FORCE] [JUSTID]
: 将 PEL 中满足条件的(如空闲时间超min-idle-time
)消息,重新分配给当前消费者consumer
。- 说明:用于处理消费者宕机导致的消息积压。
- 复杂度: O(log N) per ID.
- 返回值: 被成功认领的消息列表(Array)(默认包含 ID 和字段值);
JUSTID
时只返回 ID。
-
XINFO [CONSUMERS key groupname] | [GROUPS key] | [STREAM key [FULL]] | [HELP]
: 获取关于流、消费者组、消费者的信息。- 说明:强大的内省命令。
- 复杂度: Varies. O(N) for iterating groups/consumers.
- 返回值: 相关信息的列表或字典(Array)。
十、 发布/订阅(Pub/Sub)命令
Redis 的发布/订阅功能允许客户端订阅频道(Channel),并接收发布到这些频道的消息。
-
SUBSCRIBE channel [channel ...]
: 订阅一个或多个频道。- 说明:执行后,客户端连接将进入订阅模式,只能接收消息或执行
SUBSCRIBE
,UNSUBSCRIBE
,PSUBSCRIBE
,PUNSUBSCRIBE
,PING
,QUIT
命令。 - 返回值: 无(连接进入特殊模式,服务器会推送订阅确认和消息)。
- 说明:执行后,客户端连接将进入订阅模式,只能接收消息或执行
-
UNSUBSCRIBE [channel [channel ...]]
: 退订指定的频道,或所有频道(如果不指定频道名)。- 说明:
- 返回值: 无(服务器会推送退订确认)。
-
PSUBSCRIBE pattern [pattern ...]
: 订阅一个或多个模式匹配的频道。- 说明:
pattern
支持KEYS
命令的通配符。连接进入订阅模式。 - 返回值: 无。
- 说明:
-
PUNSUBSCRIBE [pattern [pattern ...]]
: 退订指定的模式,或所有模式。- 说明:
- 返回值: 无。
-
PUBLISH channel message
: 向指定频道channel
发布一条消息message
。- 说明:所有订阅了该频道的客户端都会收到这条消息。
- 复杂度: O(N+M),N 是订阅该频道的客户端数,M 是订阅模式匹配该频道的客户端总数。
- 返回值: 收到消息的订阅者数量(Integer)。
-
PUBSUB CHANNELS [pattern]
: 列出当前活跃的频道(至少有一个订阅者)。 PUBSUB NUMSUB [channel ...]
: 返回指定频道的订阅者数量。PUBSUB NUMPAT
: 返回当前被订阅模式的总数量。
十一、 事务(Transaction)命令
Redis 事务提供了一种将多个命令打包,然后一次性、按顺序执行的机制。它保证了原子性(要么全部执行,要么全部不执行),但不保证隔离性(事务执行期间其他客户端的命令可能插入执行)。
-
MULTI
: 标记一个事务块的开始。- 说明:之后发送的命令会被放入队列,而不是立即执行。
- 返回值: 简单字符串 “OK”。
-
EXEC
: 执行所有在MULTI
之后入队的命令。- 说明:如果事务被
DISCARD
或因WATCH
失败,则不执行。 - 返回值: 包含事务中所有命令执行结果的列表(Array);如果事务被取消,返回
nil
。
- 说明:如果事务被
-
DISCARD
: 取消事务,清空命令队列。- 说明:
- 返回值: 简单字符串 “OK”。
-
WATCH key [key ...]
: 监视一个或多个键。如果在EXEC
执行前,任何被监视的键被其他命令修改,则整个事务将被取消。- 说明:提供了一种乐观锁(CAS – Check-and-Set)的机制。
- 返回值: 简单字符串 “OK”。
-
UNWATCH
: 取消WATCH
命令对所有键的监视。- 说明:如果在
MULTI
之前执行WATCH
,通常在EXEC
或DISCARD
后会自动UNWATCH
。 - 返回值: 简单字符串 “OK”。
- 说明:如果在
十二、 脚本(Scripting)命令
Redis 支持使用 Lua 脚本来执行原子性的复杂操作。
-
EVAL script numkeys key [key ...] arg [arg ...]
: 执行指定的 Lua 脚本script
。- 说明:
numkeys
指定key
参数的数量。脚本中通过KEYS[i]
和ARGV[i]
访问键和参数。脚本执行是原子的。 - 复杂度: 取决于脚本本身。
- 返回值: 脚本的返回值。
- 说明:
-
EVALSHA sha1 numkeys key [key ...] arg [arg ...]
: 通过脚本的 SHA1 校验和来执行已缓存的脚本。- 说明:比
EVAL
更高效,节省带宽。如果脚本未缓存,会返回错误,此时客户端应使用EVAL
。 - 复杂度: 取决于脚本本身。
- 返回值: 脚本的返回值。
- 说明:比
-
SCRIPT LOAD script
: 将脚本script
加载到服务器的脚本缓存中,但不执行。- 说明:
- 返回值: 脚本的 SHA1 校验和(Bulk String)。
-
SCRIPT EXISTS sha1 [sha1 ...]
: 检查一个或多个 SHA1 校验和对应的脚本是否存在于缓存中。- 说明:
- 返回值: 包含 0 或 1 的列表(Array),1 表示存在。
-
SCRIPT FLUSH [ASYNC|SYNC]
: 清空服务器的所有 Lua 脚本缓存。- 说明:
ASYNC
/SYNC
行为类似FLUSHDB
。 - 返回值: “OK”。
- 说明:
-
SCRIPT KILL
: 尝试终止当前正在执行的、且没有执行过写操作的 Lua 脚本。- 说明:用于处理运行时间过长的只读脚本。
- 返回值: “OK”。
-
SCRIPT DEBUG YES|SYNC|NO
: (不推荐生产使用) 开启 Lua 脚本调试模式。
十三、 连接(Connection)命令
管理客户端连接。
AUTH password
/AUTH username password
: (如果服务器配置了密码/ACL) 认证连接。PING [message]
: 测试连接是否存活。返回 “PONG” 或message
。ECHO message
: 回显消息,用于测试。SELECT index
: 切换到指定的数据库(0-15)。QUIT
: 关闭当前连接。CLIENT LIST [TYPE normal|master|replica|pubsub]
: 列出所有连接到服务器的客户端信息。CLIENT KILL ip:port / ID client-id / ...
: 关闭指定的客户端连接。CLIENT GETNAME
/CLIENT SETNAME name
: 获取/设置当前连接的名字。CLIENT PAUSE timeout [WRITE|ALL]
: (Redis 3.0+) 暂停所有客户端命令处理指定毫秒数。CLIENT INFO
: (Redis 6.2+) 返回当前连接的信息。
十四、 服务器(Server)管理命令
用于管理 Redis 服务器本身。
INFO [section]
: 获取服务器的信息和统计数据(如server
,clients
,memory
,persistence
,stats
,replication
,cpu
,commandstats
,cluster
,keyspace
)。CONFIG GET parameter
: 获取服务器配置参数parameter
的值。CONFIG SET parameter value
: 动态修改服务器配置参数。并非所有参数都支持动态修改。CONFIG REWRITE
: 将当前内存中的配置持久化到redis.conf
文件(如果启动时指定了配置文件)。SAVE
: 同步将数据集保存到磁盘(RDB 文件)。会阻塞服务器。BGSAVE
: 异步在后台将数据集保存到磁盘(RDB 文件)。通常推荐使用。LASTSAVE
: 返回最后一次成功保存 RDB 文件的时间戳。MONITOR
: 实时打印出服务器接收到的所有命令(用于调试)。SLAVEOF host port
/REPLICAOF host port
: 将当前服务器设置为指定主服务器的从服务器(副本)。REPLICAOF
是 Redis 5.0+ 的推荐命令。REPLICAOF NO ONE
可使其变回主服务器。ROLE
: 返回当前实例的角色(master, replica, sentinel)。SHUTDOWN [NOSAVE|SAVE]
: 关闭服务器。NOSAVE
强制关闭不保存数据,SAVE
在关闭前执行保存(如果开启了 RDB)。TIME
: 返回服务器当前的 Unix 时间戳和微秒数。MEMORY USAGE key [SAMPLES count]
: 估算键key
及其值所占用的内存量(字节)。MEMORY STATS
: 返回服务器内存使用情况的详细报告。MEMORY DOCTOR
: (Redis 4.0+) 提供内存问题的诊断报告。MEMORY PURGE
: (Redis 4.0+) 尝试主动回收由内存分配器持有的脏页。
结语
Redis 提供了极其丰富和强大的命令集,覆盖了从基本键值操作到复杂数据结构处理、事务、脚本、集群管理等方方面面。本文梳理了其中常用和重要的部分,并提供了详细的说明。然而,Redis 仍在不断发展,新的命令和功能也在持续加入。
深入理解每个命令的功能、参数、返回值和时间复杂度,是高效使用 Redis 的关键。结合具体的应用场景,选择最合适的数据结构和命令,才能充分发挥 Redis 的高性能优势。强烈建议开发者在使用 Redis 时,经常查阅官方文档(redis.io/commands),那里有最权威、最全面的信息,并且会随着 Redis 版本的更新而更新。希望本文能为您探索 Redis 的世界提供一份有价值的地图。