redis 基础
一. redis 概述
Redis 是一个开源的、高性能的键值对(key-value)存储数据库,通常用作缓存、消息队列或持久化的数据存储。它的全称是 REmote DIctionary Server,最初由 Salvatore Sanfilippo 开发并于2009年发布。
redis 关键特点:
1.内存存储
Redis 的数据存储在内存中,这使得它非常快,可以在毫秒级甚至微秒级别内进行数据的读取和写入。
2.丰富的数据结构:
Redis 不仅支持简单的字符串键值对,还支持更复杂的数据结构,如哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)、位图(bitmaps)、超大日志(hyperloglogs)和地理空间索引(geospatial indexes)。
3.持久化:
尽管 Redis 的数据主要存储在内存中,但它可以将数据异步地保存到磁盘(通过 RDB 快照或 AOF 日志),因此在系统重启时数据不会丢失。
SAVE/BGSAVE 命令
SAVE
描述: SAVE 命令会阻塞当前 Redis 服务器,将当前时刻内存中所有的数据以快照方式写入一个默认为(dump.rdb)的二进制文件中。默认路径为当前redis的安装目录。当redis启动时,会自动加载这个文件进行数据的恢复。在此期间,Redis 无法处理任何其他请求。因此,SAVE 通常用于需要立即保存数据的特殊场景,而不是日常操作。
可以通过以下命令查看存储位置:
CONFIG GET dir
BGSAVE
用于将内存中的数据异步保存到磁盘的命令。与 SAVE 命令不同,BGSAVE 命令不会阻塞 Redis 服务器,这意味着 Redis 可以继续处理其他请求,而快照操作则在后台进行。
4.发布/订阅模式:
Redis 支持发布/订阅(Pub/Sub)消息传递模式,可以用来构建实时消息传递系统。
5.高可用性
Redis 支持主从复制(master-slave replication),可以实现数据的冗余存储和高可用性。此外,Redis 还支持哨兵(Sentinel)模式来进行自动故障转移,以及 Redis 集群(Cluster)模式来进行分布式部署。
二. redis-cli 命令
redis-cli 是 Redis 提供的命令行接口工具,用于与 Redis 服务器进行交互。它允许用户执行各种命令来管理和操作 Redis 数据库。以下是 redis-cli 的常用选项和命令详解:
redis-cli [OPTIONS] [cmd [arg [arg ...]]]
参数说明:
- redis-cli: 命令行工具的名称,用于与 Redis 服务器交互。
- [options]: 可选的命令行选项,用于配置连接参数、输出格式、脚本处理、调试、以及其他操作模式。这些选项通常以 - 或 – 开头。
- [cmd]: 要执行的 Redis 命令,例如 SET、GET、HSET 等。这是可选的,如果省略,则进入交互模式,可以手动输入命令。
- [arg [arg …]]: Redis 命令的参数。不同命令需要的参数不同,如 SET 需要键名和键值两个参数。
options 可选参数:
1. -h
指定需要连接的服务器主机名, 默认值: 127.0.0.1
redis-cli -h 192.168.1.100
2. -p
指定连接的服务器端口, 默认值:6379
redis-cli -p 6387
3. -s
指定一个 Unix 套接字文件来连接 Redis 服务器,而不是通过网络地址和端口号连接。
Unix 套接字是一种在同一台机器上的进程间通信机制,使用套接字文件可以绕过网络栈,避免网络开销, 通常比 TCP 连接更高效。使用 Unix 套接字可以限制 Redis 服务器只接受来自本地的连接,提高安全性。
redis-cli -s /path/to/redis.sock
4. -a
用于指定连接 Redis 服务器时的认证密码。如果 Redis 服务器配置了密码保护(通常通过 requirepass 选项配置),在连接时需要提供正确的密码才能执行命令,否则会被拒绝访问。
还可以使用 REDISCLI_AUTH 环境变量更安全地传递此密码,REDISCLI_AUTH 是操作系统的环境变量,用于在使用 redis-cli 连接 Redis 服务器时传递密码。通过设置这个环境变量,可以在不直接在命令行中输入密码的情况下进行身份认证,从而增强安全性。如果两者都使用,则此 -a 参数优先。
redis-cli -a 123zxcv
5. --user
在 Redis 6.0 及更高版本中,–user 选项用于指定连接到 Redis 服务器时使用的用户名。这个选项配合 Redis 的 ACL(访问控制列表)功能使用,用于基于角色的访问控制。需要用 -a 参数配合使用。
Redis 从 6.0 版本开始引入了 ACL,允许管理员创建多个用户并为每个用户分配不同的权限。ACL 主要通过 ACL SETUSER、ACL LIST、ACL SAVE 等命令进行管理。
redis-cli --user admin -a 123zxcv
6. --pass
-a 参数的别名, 为了与新的 --user 选项保持格式一致。
redis-cli -a 123zxcv
7. --askpass
用于在连接 Redis 服务器时,以安全的方式提示用户输入密码。使用这个选项时,redis-cli 不会在命令行中直接暴露密码,而是会在运行时提示用户手动输入密码。
使用 --askpass 时,-a 选项和 REDISCLI_AUTH 环境变量将被忽略。这意味着无论你是否在命令行中指定了 -a 或设置了 REDISCLI_AUTH 环境变量,redis-cli 都会提示你输入密码。
redis-cli --askpass
8. -u
用于指定 Redis 服务器的连接 URI(统一资源标识符)。通过 URI,你可以在一个字符串中简洁地指定 Redis 服务器的协议、地址、端口、数据库索引、用户名和密码等信息。
URI 格式:
redis://[[username][:password]@][host][:port][/database]
- redis://: 使用普通的 TCP 连接。
- rediss://: 使用 SSL/TLS 加密连接(需要 Redis 服务器支持)。
- username: 可选,Redis 用户名(如果使用 Redis ACL)。
- password: 可选,连接 Redis 服务器所需的密码。
- host: Redis 服务器的主机名或 IP 地址。port: Redis 服务器的端口号(默认 6379)。
- database: 可选,连接后选择的数据库索引(默认 0)。
redis-cli -u [<uri>](redis://root:123zxcv@localhost:6379/0)
9. -r
用于指定重复执行命令的次数。这个选项通常用于测试、基准测试或需要多次执行相同命令的场景。
使用时结合命令参数:
redis-cli -r <repeat> <command> [arg [arg ...]]
redis-cli -r 10 PING
10. -i
在执行重复命令使用 -r 时, 指定每次命令之间的时间间隔, 单位为秒。也可以指定一个子秒级别的时间间隔(如 0.1 秒)。。
interval 也可用于每个周期的–scan和–stat,以及每100个周期的–bigkeys、–memkeys和–hotkeys。
在使用 --scan 和 --stat 命令时,-i 控制每个周期之间的间隔时间。
例如,redis-cli --scan -i 0.5 会每 0.5 秒进行一次扫描操作。
在使用 --bigkeys、–memkeys 和 --hotkeys 这些命令时,-i 控制每 100 个周期之间的间隔时间。
例如,redis-cli --bigkeys -i 1 表示每 100 次键扫描周期之间的间隔时间为 1 秒。
redis-cli -r 10 -i 1 PING
11. -n
指定要连接的 Redis 数据库索引。Redis 默认支持 16 个数据库,索引从 0 到 15。
redis-cli -n 1
12. -2
在RESP2协议模式下启动会话。
RESP2(REdis Serialization Protocol 2)是 Redis 使用的一种通信协议版本,用于客户端与服务器之间传输数据。RESP 是一种简单且高效的二进制协议,它的设计目的是为 Redis 的请求和响应提供序列化和反序列化的标准格式。RESP2 是该协议的第二个版本,也是使用最广泛的版本。它设计简单、高效,适合 Redis 的高性能需求。
redis-cli -2
RESP2 协议特点:
- 数据类型
RESP2 支持五种主要的数据类型,分别是简单字符串、错误、整数、批量字符串和多条批量字符串。
a. 简单字符串(Simple Strings)
标识符:+
描述:简单字符串通常用于表示成功的响应。例如,执行 SET key value 命令后,Redis 返回 +OK 表示成功。
格式:+message\r\n
示例:+OK\r\n
b. 错误(Errors)
标识符:-
描述:错误消息用于表示 Redis 遇到了某种错误。例如,客户端发送了一个未定义的命令,Redis 可能返回 -ERR unknown command。
格式:-Error message\r\n
示例:-ERR wrong number of arguments for ‘get’ command\r\n
c. 整数(Integers)
标识符::
描述:整数通常用于表示命令的返回值,如 INCR 命令返回的整数或 LLEN 命令返回的列表长度。
格式::\r\n
示例::1000\r\n
d. 批量字符串(Bulk Strings)
标识符:$
描述:批量字符串用于表示二进制安全的字符串数据,包括空字符串。它可以包含任意字符集(包括二进制数据),非常灵活。
格式:$\r\n\r\n。其中 表示数据的字节长度, 是实际数据内容。
特殊情况:当批量字符串为 NULL 时, 为 -1,格式为 $-1\r\n。
示例:
普通批量字符串:$6\r\nfoobar\r\n
空批量字符串:KaTeX parse error: Undefined control sequence: \n at position 4: 0\r\̲n̲\r\n NUL…-1\r\n
e. 多条批量字符串(Arrays)
标识符:*
描述:数组通常用于表示命令的多部分结果,例如返回多条记录或一个命令的多个参数。数组可以包含其他类型的数据(如批量字符串、整数等),甚至可以嵌套数组。
格式:*\r\n\r\n\r\n…,每个元素按自己的类型编码。
特殊情况:当数组为 NULL 时, 为 -1,格式为 *-1\r\n。
示例:
包含三个批量字符串的数组:*3\r\n$3\r\nfoo\r\n$3\r\nbar\r\n$5\r\nhello\r\n
空数组:0\r\n
NULL 数组:-1\r\n
- 请求-响应模型
RESP2 协议基于简单的请求-响应模型:
请求:客户端将命令编码为 RESP2 消息,并将其发送到 Redis 服务器。
响应:Redis 服务器处理命令并返回相应的 RESP2 消息,客户端根据该消息处理结果。
每个请求和响应之间的交互是同步的,意味着客户端在发送下一个请求之前必须等待当前请求的响应。
- 二进制安全
二进制安全:RESP2 支持二进制数据,这意味着字符串可以包含任何字节序列,包括 NULL 字节或其他非 ASCII 字符。批量字符串(Bulk Strings)和数组(Arrays)都可以携带二进制数据。
- 简单而高效
RESP2 协议设计简单,每个数据类型都有明确的标识符和格式,易于实现和解析。
RESP2 的设计使得它在传输和处理上非常高效,适合 Redis 的低延迟和高吞吐量要求。
-
兼容性
向后兼容:RESP2 协议被广泛支持,大多数 Redis 客户端和服务器版本都兼容 RESP2。
与 RESP3 的对比:RESP3 是 RESP2 的改进版,增加了更多数据类型和功能。但 RESP2 仍然是许多生产环境中的默认选择,因为它足够简单和稳定。 -
错误处理
错误消息:在 RESP2 中,服务器可以通过返回带有 - 前缀的错误类型响应来通知客户端发生了问题。客户端可以通过解析此响应类型来检测并处理错误。
13. -3
在RESP3协议模式下启动会话。
RESP3是Redis 6.0 引入的新协议版本,增加了对更复杂的数据类型和更丰富响应格式的支持,例如嵌套数组、属性、NULL 类型等。RESP3 提供了更直观的返回格式,特别是在处理复合数据结构时。
redis-cli -3
RESP3 协议特点:
- 新增数据类型
a.布尔值(Boolean):True/False:RESP3 引入了布尔类型,直接表示 true 和 false。在 RESP2 中,布尔值通常使用整数 1(真)和 0(假)来表示,而 RESP3 通过特定的标识符明确表示布尔值。
b.双精度浮点数(Double-precision floating-point numbers):支持双精度浮点数,能够精确表示小数点后的数值,这在财务计算或需要高精度的场景中非常重要。
c.NULL 值:明确的 NULL, 在 RESP2 中,NULL 值通过特定的标识符表示批量字符串或数组的空值。而在 RESP3 中,NULL 是一个明确的独立数据类型,可以更直观地表示缺失或无值的情况。
d.嵌套结构(Nested Types):嵌套类型:RESP3 支持更复杂的数据结构,包括嵌套数组、字典等。可以表示嵌套的 JSON 样式结构,使得 Redis 在处理复杂数据时更加直观和方便。
e.属性(Attributes):元数据支持:RESP3 允许为某些类型的值添加属性(如元数据),这些属性可以用于提供附加信息,如注释、标签等。
- 增强的响应格式
a.更灵活的表示能力:RESP3 的响应格式能够更加直观地表示复杂数据结构,适合需要处理层次化、嵌套数据的应用场景。
b.标准化的表示:通过更明确的标识符和结构,RESP3 提供了标准化的响应格式,减少了不同客户端对响应解析时的歧义。
-
与 RESP2 的兼容
a.向后兼容:尽管 RESP3 提供了更多的数据类型和功能,它仍然与 RESP2 向后兼容。这意味着大多数使用 RESP2 的 Redis 客户端仍然能够与使用 RESP3 的服务器正常通信。
b.协议选择:客户端可以选择使用 RESP2 或 RESP3 协议,通过命令行参数(如 -3)或客户端配置来指定。 -
更丰富的数据交互
a.数据流的优化:RESP3 的设计进一步优化了数据交互过程,尤其在处理复杂命令或大数据量时表现出色。
b.支持更多数据类型:除了上述新增的数据类型,RESP3 还可以支持未来 Redis 版本中可能引入的新类型。
14. -x
用于从标准输入(stdin)读取数据,并将这些数据作为 Redis 命令的最后一个参数传递给 Redis 服务器。
注: stdin 是程序与外部世界进行交互的默认输入流。它通常连接到用户的键盘,但也可以被重定向为其他数据源,如文件或管道。当你在命令行中运行程序并输入数据时,这些数据会通过 stdin 传递给程序。程序可以读取这些输入并进行处理。
假设有一个文件 data.txt,你可以使用 -x 参数将文件内容作为 SET 命令的值传递给 Redis:
cat data.txt | redis-cli -x SET mykey
echo "value" | redis-cli -x SET mykey
15. -X
类似于 -x,但它允许你指定从标准输入读取的内容应替换为哪个参数。你可以通过指定一个占位符(如 mytag),然后在命令中将其替换为标准输入的内容。
echo "value" | redis-cli -X mytag SET mykey mytag
16. -d
在 --raw 模式下用于指定一个分隔符字符,用于在扫描操作中分隔扫描结果中的每一个数据项。这可以使得扫描结果的输出更易于处理和解析,特别是在需要以特定格式显示数据时。
redis-cli --raw -d , MGET key1 key2
17. -D
分隔每个完整的响应。适用于执行多条命令然后统一返回结果的情况。
依次执行如下命令
redis-cli --raw -D "-----" <<EOF
GET hy
GET dong
EOF
18. -c
-c 选项用于启用 Redis 集群支持。当连接到 Redis 集群中的一个节点时,redis-cli 可以自动将命令重定向到正确的节点(服从 -ASK 和 -MOVED 重定向)。Redis 集群模式允许 Redis 数据分布在多个节点上,从而提供了高可用性和可扩展性。
-ASK and -MOVED:
- MOVED: 当使用 -c 选项执行命令时,redis-cli 会尝试识别命令所涉及的键属于哪个哈希槽(hash slot)。如果键不在当前节点中,Redis 服务器会返回一个 MOVED 重定向消息,指示客户端该命令应该在另一个节点上执行。redis-cli -c 选项会自动处理这种重定向,将命令重新发送到正确的节点。
- ASK: 类似于 MOVED,ASK 是另一种重定向,但它通常用于集群重平衡期间,表示客户端需要在指定的节点上执行一次命令,但这个节点尚未正式接管哈希槽。redis-cli -c 也会自动处理这种重定向。
示例:
redis-cli -c -h cluster-node-1 -p 6379 set mykey "value"
在这个例子中,redis-cli 连接到名为 cluster-node-1 的节点,并尝试执行 SET 命令。如果 mykey 所在的哈希槽不属于这个节点,客户端会自动连接到包含该槽的正确节点,然后在该节点上执行 SET 命令。
查看集群状态信息:
redis-cli -c --cluster info
19. -e
这个选项的主要用途是确保在命令执行失败时,redis-cli 返回一个非零的退出状态码,这可以帮助在脚本或自动化任务中检测命令的成功或失败。
redis-cli -e "COMMAND [ARGUMENTS]"
20. --raw
–raw 选项用于以原始格式显示 Redis 服务器返回的数据,而不进行任何格式化或转换。
终端设备(tty) 显示会对数据进行格式化, 以便于易读。而非终端设备会以原始格式返回数据,使用 --raw 参数, 无论是不是终端设备, 均以原始格式返回数据。
redis-cli --raw GET mykey
21. --no-raw
终端设备(tty) 显示会对数据进行格式化, 以便于易读。而非终端设备会以原始格式返回数据, 使用 --no-raw 参数, 无论是不是终端设备, 均进行数据格式化。
redis-cli --no-raw GET mykey
22. --quoted-input
启用对输入的引号处理。当你使用 redis-cli 并提供这个参数时,它会将输入中的引号字符(如单引号或双引号)解释为数据的一部分,而不是作为语法的一部分。
redis-cli --quoted-input SET mykey "This is a 'quoted' string"
23. --csv
输出的数据会以 CSV 格式显示,每个字段之间用逗号分隔。对于将 Redis 命令的结果导出到 CSV 文件中,方便后续的处理或分析非常有用。
redis-cli --csv LRANGE miss 0 2
24. --json
JSON格式的输出(默认RESP3,如果要与RESP2一起使用,请使用-2),一般用于 hash 类型数据。
redis-cli --json HGETALL ai
25. --quoted-json
将 Redis 命令的输出格式化为 JSON 格式,并对 JSON 中的字符串进行额外的引号处理。这意味着输出的 JSON 字符串会被转义和引用,确保字符串中的特殊字符被正确处理。
这个参数可以帮助确保 JSON 输出符合某些特定的格式要求,特别是在需要将 JSON 数据传递给其他程序或服务时,这些程序或服务可能对输入格式有严格要求。
redis-cli --quoted-json HGETALL ai
26. --stat
显示 Redis 服务器的统计信息。这些统计信息包括 Redis 服务器的运行状态和性能指标,可以帮助你监控和分析 Redis 实例的健康状况和性能。
redis-cli --stat
共有以下几个指标:
- keys: server 中 key 的数量。
- mem: 键值对的总内存量。
- clients: 当前连接的总 clients 数量。
- blocked: 当前阻塞的客户端数量。
- requests: 服务器请求总次数 (+1) 截止上次请求增加次数。
- connections: 服务器连接次数。
27. --latency
显示 Redis 实例的延迟统计信息。通过使用这个参数,你可以监控 Redis 操作的延迟,帮助诊断和优化 Redis 的性能。
如果在交互式会话中使用这个模式,redis-cli 会无限循环,实时显示延迟统计信息。
如果指定了 --raw 或 --csv 参数,或者将输出重定向到非终端(TTY),redis-cli 会采样延迟数据 1 秒钟(可以使用 -i 参数更改采样间隔),然后生成一次性输出并退出。
redis-cli --latency -i 30
28. --latency-history
类似于 --latency,但它会追踪延迟随时间的变化。默认每 15 秒记录一次延迟数据。使用 -i 参数来更改这个时间间隔。
redis-cli --latency-history -i 30
29. --latency-dist
将 Redis 实例的延迟以光谱形式展示,这种显示方式需要支持 256 色的 xterm 终端。默认时间间隔为1秒。使用-i更改它。
redis-cli --latency-dist
30. --lru-test
用于模拟一个具有 80-20 分布的缓存工作负载。以测试 Redis 在 LRU 缓存策略下的表现。
这里的 80-20 分布意味着 80% 的访问会集中在 20% 的键上,这种分布常用于表示真实世界中常见的“热点”数据访问模式。
生成 10000 个键,并模拟一个具有 80-20 分布的访问模式:
redis-cli --lru-test 10000
31. --replica
将 redis-cli 连接转换为一个伪造的从节点(副本节点),该客户端将开始接收并显示主节点的复制流。这允许用户查看和调试主节点的复制数据流,仿佛 redis-cli 是一个实际的副本节点,验证副本的数据是否与主节点一致。
redis-cli --replica
32. --rdb
从 Redis 服务器导出当前数据库的 RDB (Redis Database Backup) 文件,并将其保存到指定的文件中。
redis-cli --rdb dump.rdb
33. -functions-rdb
用于导出 Redis 数据库中的所有函数到一个 RDB 文件。这是一个与 Redis 函数相关的新功能,用于备份和恢复 Redis 中定义的函数。
redis-cli --functions-rdb functions.rdb
34. --pipe
用于高效批量执行大量命令的一个强大工具。它允许你通过管道方式一次性将多个命令发送到 Redis 服务器,而不是逐个发送每个命令。这样可以显著减少网络延迟,提高操作的效率。
Redis CLI 与 Redis 服务器的通信是基于请求-响应的模式,每发送一个命令,服务器会处理并返回结果。这种模式在执行大量命令时可能会因为频繁的网络往返而导致性能下降。–pipe 参数通过管道将多个命令打包在一起发送给 Redis 服务器,服务器处理完所有命令后,再一次性返回所有响应。这样可以减少网络延迟,提高命令的执行速度。
例如有个 commands.txt 文件, 里面的命令为换行模式:
SET a a
SET b b
SET c c
SET d d
将命令集批量执行:
cat commands.txt | redis-cli --pipe
35. --pipe-timeout
在–pipe模式下,如果在发送所有数据后,在秒内没有收到回复,则中止并返回错误。
默认超时时间为30秒,为 0 时永远等待。
cat commands.txt | redis-cli --pipe --pipe-timeout 10
36. --bigkeys
扫描 Redis 数据库中的所有键,统计每种数据类型中包含最多元素的键,并将其报告出来。其中字符串统计字符长度。
redis-cli --bigkeys
37. --memkeys
扫描 Redis 数据库中的所有键,统计每种数据类型占用大量内存的健。
redis-cli --memkeys
38. --memkeys-samples
扫描 Redis 键的样本,查找占用大量内存的健,并允许定义要采样的关键元素的数量。
redis-cli --memkeys-samples <n>
39. --hotkeys
寻找 Redis 热键,仅在 maxmemory-policy 为 *lfu 时有效。
redis-cli --hotkeys
40. --scan
使用 SCAN 命令列出所有键。
redis-cli --scan
41. --pattern
用于在执行与键相关的操作时,限制操作的范围只应用于匹配指定模式的键。这个选项通常与其他选项一起使用,如 --bigkeys、–hotkeys 或 --scan,以便更有针对性地分析或操作 Redis 数据库中的特定键。
Redis 的模式匹配支持以下通配符:
-
- 匹配任意多个字符(包括零个字符)。
- ? 匹配任意一个字符。
- [abc] 匹配 a, b, 或 c 中的任意一个字符。
- [a-z] 匹配 a 到 z 范围内的任意字符。
42. --quoted-pattern
与 --pattern 相同,但指定的字符串可以是引号,以便传递非二进制安全字符串。
redis-cli --quoted-pattern <pat>
43. --intrinsic-latency
用于在指定的秒数内(由 参数指定)测试和测量 Redis 服务器的固有延迟。固有延迟是指 Redis 在执行简单操作时所遇到的最小延迟,这些操作不包括网络延迟或复杂命令的执行时间,而是聚焦于系统层面的问题,如操作系统调度、硬件性能等。
redis-cli --intrinsic-latency 30
44. --eval
用于执行包含在指定文件中的 Lua 脚本。Lua 脚本是一种可以在 Redis 中执行的脚本语言,允许用户编写复杂的操作,并在 Redis 服务器上执行这些操作。这个选项特别适用于需要在 Redis 中进行高级数据操作或事务性操作的场景。
完整命令:
redis-cli --eval <file> [key1 key2 ...] [arg1 arg2 ...]
[key1 key2 …]: (可选)脚本中可以使用 KEYS 数组来引用这些键。
[arg1 arg2 …]: (可选)脚本中可以使用 ARGV 数组来引用这些参数。
例如有个 lua 脚本 myscript.lua:
-- 获取 Redis 键的值
local value1 = redis.call("GET", KEYS[1]) -- 获取 key1 的值
local value2 = redis.call("GET", KEYS[2]) -- 获取 key2 的值
-- 获取传入的参数
local arg1 = ARGV[1]
local arg2 = ARGV[2]
local arg3 = ARGV[3]
-- 拼接所有获取的值和参数
local result = value1 .. " " .. value2 .. " " .. arg1 .. " " .. arg2 .. " " .. arg3
-- 返回拼接后的结果
return result
redis-cli --eval myscript.lua key1 key2 , arg1 arg2 arg3
45. --ldb
用于启用 Lua 脚本调试器(Lua Debugger)。这个选项可以帮助开发者逐步调试在 Redis 中运行的 Lua 脚本,逐行检查脚本的执行过程,设置断点,查看变量值等。它是调试 Redis Lua 脚本的强大工具,特别是在脚本复杂或出现问题时非常有用。
redis-cli --ldb --eval myscript.lua key1 key2 , arg1 arg2 arg3
46. --ldb-sync-mode
启用 Lua 脚本调试器的同步模式。在同步模式下,Redis 在这会话期间, 会在每次调用 Lua 脚本时自动进入调试器,而无需手动启动。这对于需要频繁调试脚本的场景非常有用,尤其是在开发和测试环境中。
redis-cli --ldb-sync-mode
47. --cluster [args…] [opts…]
用于执行与 Redis 集群相关的管理命令。通过这个选项,你可以执行各种集群管理任务,如创建集群、添加节点、删除节点、重新分配槽位等。
48. --verbose
用于增加输出信息的详细程度。当你使用这个选项时,redis-cli 会提供更详细的运行信息,以帮助你更好地了解命令执行的过程和结果。这对于调试、监控和诊断问题非常有用。
redis-cli --verbose SET mykey "hello"
49. --no-auth-warning
在命令行界面使用密码时不显示警告信息。
redis-cli --no-auth-warning -h 192.168.1.111
50. --help
输出帮助信息并退出。
redis-cli --help
51. --version
输出版本信息并退出。
redis-cli --version
三. redis 配置相关命令
Redis 的配置文件默认位于 Redis 安装目录下,文件名为 redis.conf。在 Windows 系统中,配置文件名为 redis.windows.conf。
CONFIG GET 命令
用于获取 Redis 配置文件中的配置参数。你可以使用它来检索特定配置参数的当前值,或者获取所有配置项的值。如果为 *, 则返回所有配置。
CONFIG GET parameter [parameter ...]
CONFIG SET 命令
用于动态修改 Redis 服务器的配置参数。通过这个命令,你可以在不重启 Redis 的情况下更改配置项。修改后的配置会立即生效,但默认情况下仅在当前会话有效,重启后会恢复为原来的配置,除非你将更改保存到配置文件。
CONFIG SET parameter value [parameter value ...]
CONFIG REWRITE 命令
用于将 Redis 服务器当前的配置写回到配置文件中。这个命令会自动更新配置文件,将通过 CONFIG SET 命令修改过的配置项永久保存下来,以确保这些配置在 Redis 重启后依然有效。
CONFIG REWRITE
CONFIG RESETSTAT 命令
用于重置统计数据。这些统计数据包括 Redis 服务器在运行期间收集的各种操作计数器,如已连接的客户端数、命中/未命中次数、已执行的命令数、网络输入/输出字节数等。当执行 CONFIG RESETSTAT 命令时,Redis 会将其内部记录的所有统计计数器重置为零。该命令只重置统计数据,不会影响 Redis 的实际运行状态、数据存储或配置。
CONFIG RESETSTAT
重置统计数据:
- 命令统计:total_commands_processed( 处理的命令总数)、instantaneous_ops_per_sec( 每秒执行的命令数,这是一个动态值,反映当前的命令处理速率)、rejected_connections( 因为最大客户端连接数限制而被拒绝的连接次数)。
- 键空间统计:keyspace_hits( 键命中次数,当客户端请求的键存在于数据库中时计数)、keyspace_misses( 键未命中次数,当客户端请求的键不存在时计数)、expired_keys( 因为生存时间(TTL)到期而被删除的键数)、evicted_keys( 因为达到最大内存限制而被驱逐的键数)。
- 网络统计:total_net_input_bytes( 网络输入的字节总数)、total_net_output_bytes( 网络输出的字节总数)、instantaneous_input_kbps( 当前每秒接收到的网络流量,单位为 KB)、instantaneous_output_kbps( 当前每秒发送出的网络流量,单位为 KB)。
- 连接统计:total_connections_received( 自 Redis 启动以来接收到的客户端连接总数)、connected_clients( 当前连接的客户端数(不包括通过从库连接的客户端))、connected_slaves( 当前连接的从库数量)、blocked_clients( 当前阻塞的客户端数量(等待列表或其他操作))。
- 内存使用统计:used_memory( Redis 当前使用的内存总量)、used_memory_rss( Redis 从操作系统获取的总内存量(驻留集大小))、used_memory_peak( Redis 使用的最大内存量)、used_memory_lua( Lua 引擎使用的内存量)、used_memory_overhead( Redis 内部数据结构(如哈希表)的开销)、mem_fragmentation_ratio( 内存碎片率,表示 used_memory_rss 与 used_memory 之间的比率)。
- 持久化统计:rdb_changes_since_last_save( 自上次 RDB 保存以来的更改次数)、rdb_last_save_time( 上次 RDB 保存的 Unix 时间戳)、rdb_last_bgsave_status( 上次 RDB 保存的状态(成功或失败))、aof_last_rewrite_time_sec( 上次 AOF 重写的时间(秒))、aof_last_bgrewrite_status( 上次 AOF 重写的状态(成功或失败))、aof_last_write_status( 上次 AOF 写操作的状态(成功或失败))。
- 复制统计:role( Redis 实例的角色(主节点 master 或从节点 slave))、connected_slaves( 当前连接的从库数量)、master_repl_offset( 主节点的复制偏移量)、slave_repl_offset( 从节点的复制偏移量)、repl_backlog_active( 复制积压缓冲区是否激活)、repl_backlog_size( 复制积压缓冲区的大小)、repl_backlog_histlen( 复制积压缓冲区的实际长度)。
- 客户端统计:client_longest_output_list( 具有最长输出列表的客户端(等待发送数据的字节数))、client_biggest_input_buf( 具有最大输入缓冲区的客户端(接收到但未处理的数据的字节数))、blocked_clients( 当前阻塞的客户端数量)。
- 慢查询日志统计:slowlog_last_id( 最近记录的慢查询日志的 ID)、slowlog_entries( 慢查询日志中的条目数)、slowlog_duration_usec( 记录的慢查询的最长执行时间(微秒))、
- 其他统计:uptime_in_seconds( 自 Redis 启动以来的时间(秒))、uptime_in_days( 自 Redis 启动以来的时间(天))、hz( Redis 服务器的频率(调度频率))、lru_clock( LRU 时钟,Redis 内部用于 LRU 过期机制的时钟)。
CONFIG HELP 命令
CONFIG HELP
用于获取关于 CONFIG 命令的帮助信息。
四. redis 支持的数据结构
Redis 支持多种数据结构,这些结构使 Redis 能够灵活地处理各种类型的数据和应用场景。以下是 Redis 支持的主要数据结构:
1. 字符串(String)
描述:最基本的数据类型。可以存储任何形式的字符串,包括二进制数据(如图片、音频等)。
应用:常用于缓存对象、计数器、会话管理等。
1.1 插入数据
SET/SETNX 命令
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
S描述: 新增或修改数据, SET 命令是 Redis 中非常灵活且常用的命令,它有多种选项,可以指定不同的行为。
参数说明:
- [NX | XX]
NX: 只在键不存在时设置键值。这个选项常用于实现分布式锁,因为它可以保证只有一个客户端能成功设置值。即,如果键已经存在,SET 操作不会执行,返回 nil。
XX: 只在键已经存在时设置键值。这个选项用于确保只有在键已存在时才更新其值。即,如果键不存在,SET 操作不会执行,返回 nil。 - [GET]: 在设置新值之前,返回键的旧值。如果键不存在,则返回 nil。这是 Redis 6.2 之后引入的功能,类似于 GETSET 的功能,但可以与其他选项结合使用。
- [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
EX seconds: 将键的过期时间设置为 seconds 秒。过期时间到期后,键将自动被删除。
PX milliseconds: 将键的过期时间设置为 milliseconds 毫秒。
EXAT unix-time-seconds: 将键的过期时间设置为特定的 Unix 时间戳(以秒为单位)。键将在指定的时间点过期。
PXAT unix-time-milliseconds: 将键的过期时间设置为特定的 Unix 时间戳(以毫秒为单位)。键将在指定的时间点过期。
KEEPTTL: 保持键原来的 TTL(过期时间),即使在 SET 操作后,也不会改变键的过期时间。这个选项适合那些需要更新键值但不想修改其过期时间的场景。
SETNX key value
描述: 仅当键 key 不存在时,才将键 key 的值设置为 value。如果键已存在,则不做任何操作。如果设置成功,返回 1;如果键已存在,返回 0。
SETEX/PSETEX 命令
SETEX key seconds value
描述: 设置键 key 的值为 value,并设置过期时间 seconds 秒。
PSETEX key milliseconds value
描述: 设置键 key 的值为 value,并设置过期时间 milliseconds 毫秒。
MSET/MSETNX 命令
MSET key value [key value ...]
描述: 一次设置多个键的值。
MSETNX key value [key value ...]
描述: 一次设置多个键的值,只有在所有键都不存在时,才会进行设置。任何一个键已存在时,所有操作都会失败。
1.2 更新数据
INCR/INCRBY/INCRBYFLOAT 命令
INCR key
描述: 将键 key 的值自增 1。如果键不存在,则将其值初始化为 0 然后再进行操作。
注: 必须为整数数字类型的值,否则报错。
INCRBY key increment
描述: 将键 key 的值增加 increment。如果键不存在,则将其值初始化为 0 然后再进行操作。
注: 必须为整数数字类型的值, 否则报错。
INCRBYFLOAT key increment
描述: 将键 key 的值增加指定的浮点数 increment。如果键不存在,则将其值初始化为 0.0 然后再进行操作。
注: 必须为数字类型的值,否则报错。
DECR/DECRBY 命令
DECR key
描述: 将键 key 的值自减 1。如果键不存在,则将其值初始化为 0 然后再进行操作。
注: 必须为整数数字类型的值, 否则报错。
DECRBY key decrement
描述: 将键 key 的值减少 decrement。如果键不存在,则将其值初始化为 0 然后再进行操作。
注: 必须为整数数字类型的值, 否则报错。
APPEND 命令
APPEND key value
描述: 将给定的 value 追加到键 key 的当前值之后。如果键不存在,将创建键并设置其值为 value。
GETSET 命令
GETSET key value
描述: 将键 key 的值设置为 value,并返回键 key 的旧值。此操作是原子的。
SETRANGE 命令
SETRANGE key offset value
描述: 从键 key 的字符串值的指定偏移量 offset 开始,替换为 value 的内容。如果 offset 超过当前字符串长度,字符串将自动填充空白(\x00)以适应 offset。
1.3 查询数据
GET/MGET 命令
GET key
描述: 获取指定键 key 的值。如果键不存在,返回 nil。
MGET key1 key2 key3
描述: 一次获取多个键的值。返回按顺序排列的值列表。如果某个键不存在,返回 nil。
GETRANGE 命令
GETRANGE key start end
描述: 获取键 key 的值的子字符串,从 start 到 end 范围内的字符。索引从 0 开始,可以使用负数索引表示从末尾开始。start 和 end 都是包含性的。
STRLEN 命令
STRLEN key
描述: 返回键 key 的字符串值的长度。如果键不存在,返回 0。
2. 哈希(Hash)
描述:键值对集合,类似于 Python 的字典或 Java 的 HashMap。每个哈希可以包含多个键值对。
应用:适合存储对象,例如用户信息(用户名、密码、邮箱等),因为可以只更新或读取对象中的部分字段。
2.1 插入数据
HSET/HSETNX/HMSET 命令
HSET key field value [field value ...]
描述: 设置哈希表 key 中字段 field 的值为 value。如果 key 值不存在, 则创建, 如果字段已经存在,HSET 会更新这个字段的值;如果字段不存在,则插入这个字段。
返回值: 如果字段是新创建的,返回 1;如果字段已经存在并被更新,返回 0。
HSETNX key field value
描述: 仅当字段 field 不存在时,才设置哈希表 key 中字段 field 的值为 value。如果字段已经存在,则不进行任何操作。
返回值: 如果字段是新创建的,返回 1;如果字段已经存在,返回 0。
HMSET key field value [field value ...]
描述: 同时设置多个字段和值对到哈希表 key 中。如果某个字段已经存在,HMSET 会更新它的值。
注: 虽然 HMSET 仍然可用,但从 Redis 4.0.0 开始,推荐使用 HSET 来替代它。
2.2 更新数据
HINCRBY/HINCRBYFLOAT 命令
HINCRBY key field increment
描述: 为哈希表 key 中的字段 field 的整数值增加 increment。如果字段不存在,则初始化为 0,然后执行加法操作。这个命令用于数值字段的更新。
HINCRBYFLOAT key field increment
描述: 为哈希表 key 中的字段 field 的浮点数值增加 increment。如果字段不存在,则初始化为 0.0,然后执行加法操作。
2.3 查看数据
HGET/HMGET 命令
HGET key field
描述: 返回哈希表 key 中,给定字段 field 的值。
HMGET key field [field ...]
描述: 返回哈希表 key 中,一个或多个给定字段的值。如果某个字段不存在,则返回 nil。
HGETALL 命令
HGETALL key
描述: 返回哈希表 key 中,所有字段和值的列表。每个字段的名称紧跟其值。
HEXISTS 命令
HEXISTS key field
描述: 检查给定的字段 field 是否存在于哈希表 key 中。
返回值: 如果存在,返回 1;否则返回 0。
HLEN 命令
HLEN key
描述: 返回哈希表 key 中字段的数量。
HKEYS 命令
HKEYS key
描述: 返回哈希表 key 中的所有字段名。
HVALS 命令
HVALS key
描述: 返回哈希表 key 中的所有值。
HSTRLEN 命令
HSTRLEN key field
描述: 返回哈希表 key 中,字段 field 的值的字符串长度。如果字段不存在,则返回 0。
HRANDFIELD 命令
HRANDFIELD key [count [WITHVALUES]]
描述: Redis 6.2 及更高版本中的一个命令,用于从哈希表中随机返回一个或多个字段。这个命令可以选择只返回字段名,或者同时返回字段名及其对应的值。
HSCAN 命令
HSCAN key cursor [MATCH pattern] [COUNT count]
描述: 迭代哈希表 key 中的键值对。HSCAN 通常用于遍历大型哈希表,不会一次性返回所有数据,而是逐步返回(增量式迭代),这对于处理大数据集时很有用。
参数说明: 同 SCAN 命令参数。
2.4 删除数据
HDEL 命令
HDEL key field [field ...]
描述: 删除哈希表 key 中的一个或多个指定字段。
返回值: 返回被成功删除的字段数量。
3. 列表(List)
描述:简单的链表,按插入顺序排序。可以从列表的两端(左端或右端)推入和弹出元素。
应用:可用于消息队列、任务列表、评论流、时间序列数据等。
3.1 插入数据
list 类型的数据并没有单独的创建命令。Redis 是通过插入数据来隐式创建 list 类型的数据。如果尝试对一个不存在的 list 执行插入操作,Redis 会自动创建一个新的 list,并将元素添加到该列表中。
LPUSH/RPUSH 命令
LPUSH key element [element ...]
描述: 将一个或多个值插入到列表 key 的头部(左侧)。
返回值: 列表的长度。
RPUSH key element [element ...]
描述: 将一个或多个值插入到列表 key 的尾部(右侧)。
返回值: 列表的长度。
LPUSHX/RPUSHX 命令
LPUSHX key element [element ...]
描述: 仅当列表 key 存在时,将值插入到列表 key 的头部(左侧)。如果列表不存在,该命令不执行任何操作。
返回值: 列表的长度。
RPUSHX key element [element ...]
描述: 仅当列表 key 存在时,将值插入到列表 key 的尾部(右侧)。如果列表不存在,该命令不执行任何操作。
返回值: 列表的长度。
LINSERT 命令
LINSERT key BEFORE | AFTER pivot element
描述: 在列表 key 中的 pivot 元素前或后插入 value。pivot 是列表中现有的值。
返回值: 如果 pivot 找到并且插入成功,返回列表的长度;如果 pivot 未找到,返回 -1;如果 key 不存在,返回 0。
参数:
- BEFORE: 在 pivot 之前插入。
- AFTER: 在 pivot 之后插入。
3.2 更新数据
LSET 命令
LSET key index element
描述: 设置 key 列表中指定索引位置的元素为 value。但是,如果 key 不存在,LSET 会返回一个错误,表示列表不存在。因此,LSET 不能用于创建新列表。
列表中的索引位置,可以为正数(从左到右,从 0 开始),也可以为负数(从右到左,从 -1 开始)。
3.3 查询操作
LRANGE 命令
LRANGE key start stop
描述: 返回列表中指定范围内的元素。start和stop 均包含在内。
LLEN 命令
LLEN key
描述: 返回列表的长度(元素个数)。
LINDEX 命令
LINDEX key index
描述: 返回列表中指定索引的元素。
index: 元素的索引(可以是负数,负数表示从尾部开始计算,-1 是最后一个元素)。
3.4 删除操作
LREM 命令
LREM key count element
描述: 根据值删除列表中的元素,间接实现更新操作。
参数说明:
count: 指定删除的数量:
-
0: 从头到尾删除 count 个值相同的元素。
- < 0: 从尾到头删除 count 个值相同的元素。
- = 0: 删除所有值相同的元素。
LTRIM 命令
LTRIM key start stop
描述: 修剪列表,只保留指定范围内的元素。start和stop 均包含在内。
3.5 其它操作
LPOP/RPOP 命令
LPOP key [count]
描述: 于从列表的左侧(即头部)移除并返回元素。在 Redis 6.2 及以后的版本中,LPOP 命令支持一个可选的 count 参数,用于一次性移除并返回多个元素。
RPOP key [count]
描述: 从列表的右侧(即尾部)移除并返回元素。在 Redis 6.2 及以后的版本中,RPOP 命令支持一个可选的 count 参数,用于一次性移除并返回多个元素。
BLPOP/BRPOP 命令
BLPOP key [key ...] timeout
描述: 从一个或多个列表中弹出并返回最左侧的元素(即列表的头部)。如果所有指定的列表都为空,BLPOP 将阻塞(即等待),直到有元素可以弹出或超时。
BRPOP key [key ...] timeout
描述: 从一个或多个列表的右侧(即尾部)移除并返回元素。与 BLPOP 类似,BRPOP 会在所有指定的列表都为空时阻塞(即等待),直到有元素可以弹出或超时。
timeout: 阻塞的超时时间,以秒为单位。超时时间到达后,如果仍然没有可弹出的元素,BLPOP 会返回 nil。如果 timeout 为 0,则表示无限等待,直到至少一个列表有元素可弹出。
RPOPLPUSH/BRPOPLPUSH 命令
RPOPLPUSH source destination
描述: 将 source 列表的最后一个元素弹出,并将其插入到 destination 列表的头部。如果 destination 列表不存在,Redis 将自动创建一个新的 list。
BRPOPLPUSH source destination timeout
描述: 类似于 RPOPLPUSH,结合了 RPOP 和 LPUSH 的功能,并具有阻塞特性。该命令从 source 列表的尾部弹出一个元素,并将其推入到 destination 列表的头部(即列表的左侧)。如果 source 列表为空,则命令会阻塞,直到有元素可用或达到超时时间。
timeout: 指定阻塞的最大时间,单位为秒。timeout 为 0 表示无限期阻塞,直到有元素可以从 source 列表弹出。
如果在 timeout 时间内 source 列表没有元素可弹出,命令返回 nil。
4. 集合(Set)
描述:无序的唯一元素集合。Redis 的集合是基于哈希表实现的,所以添加、删除、查找操作的时间复杂度都是 O(1)。
应用:适合用来存储无序且唯一的数据,如标签集合、用户角色、去重操作等。
4.1 添加操作
SADD 命令
SADD key member [member ...]
描述:会将一个或多个成员添加到集合中,如集合不存在, 则创建一个新集合, 如果成员已经存在,则不会添加。
4.2 查询操作
SMEMBERS 命令
SMEMBERS key
作用: 返回集合中的所有成员。
SRANDMEMBER 命令
SRANDMEMBER key [count]
描述: 从集合中返回一个或多个随机成员,但不移除它们。
count: 指定要返回的随机成员数量。如果 count 是负数,则表示返回指定数量的随机成员,如果负数的绝对值大于集合长度, 则可能返回包含重复元素的列表。
SISMEMBER 命令
SISMEMBER key member
描述: 检查某个成员是否存在于集合中。如果成员存在于集合中,返回 1, 否则返回 0。
SCARD 命令
SCARD key
描述: 返回集合的成员数量(集合的基数)
4.3 删除操作
SREM 命令
SREM key member [member ...]
描述: 从集合中移除一个或多个成员。
4.4 其它操作
SPOP 命令
SPOP key [count]
描述: 从集合中随机移除并返回一个或多个成员。count 大于 1 时,返回一个包含多个移除成员的列表。
SDIFF/SDIFFSTORE 命令
SDIFF key [key ...]
描述: 返回第一个集合减去其他集合的差集。
SDIFFSTORE destination key [key ...]
描述: 计算第一个集合与其他集合的差集,并将结果存储在 destination 集合中。
SUNION/SUNIONSTORE 命令
SUNION key [key ...]
描述: 返回所有指定集合的并集。
SUNIONSTORE destination key [key ...]
描述: 计算指定集合的并集,并将结果存储在 destination 集合中。
SINTER/SINTERSTORE 命令
SINTER key [key ...]
描述: 返回所有指定集合的交集。
SINTERSTORE destination key [key ...]
描述: 计算指定集合的交集,并将结果存储在 destination 集合中。
SMOVE 命令
SMOVE source destination member
描述: 从一个集合中移动一个成员到另一个集合。
参数说明:
- source: 原集合的键名。
- destination: 目标集合的键名。
- member: 要移动的成员。
5. 有序集合(Sorted Set)
描述:与集合类似,但每个元素都关联了一个分数,Redis 按分数排序元素, 默认从小到大排名。它结合了哈希表和跳跃表来提供有序集合功能。
应用:适用于排行榜、优先级队列、按时间排序的事件等。
5.1 新增修改操作
ZADD 命令
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
描述:将一个或多个成员添加到有序集合中,同时为每个成员分配一个分数。如果成员已经存在,它可以更新该成员的分数。
参数说明:
-
key: 有序集合的键名。如果该键不存在,则会创建一个新的有序集合。
-
score: 分配给成员的分数。分数可以是整数或浮点数。成员在集合中按分数从小到大排序。
-
member: 要添加或更新的成员名称。
-
[NX | XX]:
NX: 仅当成员不存在时,才添加成员。这意味着,如果成员已经在集合中,ZADD 不会更新它的分数。
XX: 仅当成员已经存在时,才更新成员的分数。如果成员不存在,则 ZADD 不会进行任何操作。 -
[GT | LT]:
GT: 仅当新分数 大于 当前成员的分数时,才更新成员的分数。如果成员不存在,此选项无效。
LT: 仅当新分数 小于 当前成员的分数时,才更新成员的分数。如果成员不存在,此选项无效。 -
CH (Change): 当成员的分数发生变化时,返回的整数将表示有多少个成员的分数确实发生了变化,而不仅仅是成员数量的变化。如果 CH 被指定,命令会返回实际修改的成员数目。
-
INCR (Increment): 不是将分数设置为一个绝对值,而是将分数增加指定的增量。如果使用 INCR,ZADD 命令只接受一个成员/分数对。如果该成员不存在,则会将其添加到有序集合中,并将其分数设置为增量。如果成员已存在,则在其当前分数上增加增量。
ZINCRBY 命令
ZINCRBY key increment member
描述: 增加有序集合中成员的分数。如果成员不存在,则会先添加成员。
5.2 查询操作
ZRANGE/ZREVRANGE 命令
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
描述: ZRANGE 是 Redis 6.2 版本引入的用于查询有序集合(Sorted Set)成员的一个增强版命令,它可以通过索引、分数或字典序来查询成员,并支持反向排序、分页等多种选项。
参数说明:
- start/stop: 指定返回成员的索引范围,0 表示第一个成员,-1 表示最后一个成员。
注: 当使用 BYSCORE 或 BYLEX 选项时,start 和 stop 的含义会有所不同(表示分数或字典序范围)。 - [BYSCORE | BYLEX]:
BYSCORE: 根据分数来排序和查询成员,start 和 stop 将被解释为分数区间。
BYLEX: 根据成员的字典序来排序和查询成员,start 和 stop 将被解释为字典序范围。字典序使用 ( 和 [ 来表示开区间和闭区间。
例如:ZRANGE key [a [z BYLEX 会返回成员名在 a 到 z 之间的成员。 - REV: 反向排序,即按从大到小的顺序返回结果。与默认的从小到大的顺序相反。可以与 BYSCORE 或 BYLEX 结合使用,实现反向的分数或字典序排序。
- LIMIT offset count: 用于分页查询,offset 是偏移量,count 是返回的最大成员数量。
- WITHSCORES: 如果指定此选项,则返回结果中将包含成员的分数。
ZREVRANGE key start stop [WITHSCORES]
描述: 返回有序集合中指定区间内的成员,按分数从大到小排序。
ZRANGEBYSCORE/ZREVRANGEBYSCORE 命令
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
描述: 用于按分数范围查询有序集合(Sorted Set)成员的命令。它可以根据指定的分数范围返回集合中的成员,查询结果按分数从低到高排序。还可以使用一些选项来控制输出格式或限制结果数量。
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
描述: 返回有序集合中分数在指定范围内的成员,按分数从大到小排序。
参数说明:
-
min/max: 分别表示查询的分数下限和上限,确定查询结果的分数范围。
区间边界: 默认情况下,不带 ( 或 [ 的参数表示闭区间, 可以使用 ( 来表示开区间,例如 (5 表示大于 5。
-inf 和 +inf 可以用来表示无穷小和无穷大,表示不设下限或上限。 -
WITHSCORES: 如果指定此选项,返回的结果将包含成员的分数。
-
LIMIT offset count: 用于分页查询,offset 是偏移量,count 是返回的最大成员数量。
ZRANGEBYLEX/ZREVRANGEBYLEX 命令
ZRANGEBYLEX key min max [LIMIT offset count]
描述: 按字典序查询有序集合(Sorted Set)成员的命令。与 ZRANGEBYSCORE 不同,它是基于成员的字典序进行查询,而不是基于分数。该命令适用于成员值是字符串且需要按字典顺序进行范围查询的场景。
ZREVRANGEBYLEX key max min [LIMIT offset count]
描述: 按成员字典序逆序返回指定范围内的成员。
参数说明:
- min/max: 指定查询的字典序范围,确定查询结果的范围边界。
区间边界: 使用 ( 来表示开区间,例如 (abc 表示字典序大于 abc。使用 [ 来表示闭区间,例如 [abc 表示字典序大于等于 abc。
- 代表最小值,+ 代表最大值,类似 -inf 和 +inf 用于表示无穷小和无穷大。
示例:
ZRANGEBYLEX myzset [a [z 返回字典序在 a 到 z 之间的成员。
ZRANGEBYLEX myzset (b [m 返回字典序在 b 之后且在 m 之前的成员。
ZRANK/ZREVRANK 命令
ZRANK key member [WITHSCORE]
描述: 返回有序集合中成员的排名,按分数从小到大排序。
ZREVRANK key member [WITHSCORE]
描述: 返回有序集合中成员的排名,按分数从大到小排序。
ZSCORE 命令
ZSCORE key member
描述: 返回有序集合中指定成员的分数。
ZCOUNT 命令
ZCOUNT key min max
描述: 计算有序集合中分数在指定范围内的成员数量。min/max 参数与 ZRANGEBYSCORE/ZREVRANGEBYSCORE 命令相同。
ZLEXCOUNT 命令
ZLEXCOUNT key min max
描述: 获取成员按字典序在指定范围内的数量。
ZCARD 命令
ZCARD key
描述: 获取有序集合中的成员数量。
ZRANDMEMBER 命令
ZRANDMEMBER key [count [WITHSCORES]]
ZSCAN 命令
ZSCAN key cursor [MATCH pattern] [COUNT count]
描述: ZSCAN 命令用于迭代有序集合(Sorted Set)中的元素,并且在每次迭代时返回一部分元素。与 ZRANGE 等命令不同,ZSCAN 更适合在数据量较大时进行增量式遍历,因为它不会一次性返回所有元素,而是允许通过游标(cursor)进行分批次扫描。
参数说明: 同 SCAN 命令参数。
5.2 删除操作
ZREM 命令
ZREM key member [member ...]
描述: 删除指定的一个或多个成员。
ZREMRANGEBYSCORE 命令
ZREMRANGEBYSCORE key min max
描述: 删除分数在指定范围内的所有成员。min/max 参数与 ZRANGEBYSCORE/ZREVRANGEBYSCORE 命令相同。
ZREMRANGEBYRANK 命令
ZREMRANGEBYRANK key start stop
描述: 删除有序集合中指定排名范围内成员的命令。该命令按成员在有序集合中的排名(即按分数从小到大的顺序)删除元素,而不是按分数值或成员值。start和stop 均包含在内
ZREMRANGEBYLEX 命令
ZREMRANGEBYLEX key min max
描述: 删除字典序在指定范围内的所有成员。min/max 参数与 ZRANGEBYSCORE/ZREVRANGEBYSCORE 命令相同。
5.4 其它操作
ZPOPMIN/ZPOPMAX 命令
ZPOPMIN key [count]
描述: 移除并返回有序集合中分数最低的 count 个成员。
ZPOPMAX key [count]
描述: 移除并返回有序集合中分数最高的 count 个成员。
ZDIFF/ZDIFFSTORE 命令
ZDIFF numkeys key [key ...] [WITHSCORES]
描述: 返回给定的一个或多个有序集合之间的差集。
ZDIFFSTORE destination numkeys key [key ...]
描述: 计算有序集合(Sorted Set)之间的差集,并将结果存储到一个新的有序集合中。
ZUNION/ZUNIONSTORE 命令
ZUNION numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM | MIN | MAX] [WITHSCORES]
描述: 计算多个有序集合(Sorted Set)并集的命令。它可以合并多个有序集合中的元素,并根据需要对元素的分数进行加权和聚合。计算完成后,结果会直接返回给客户端。
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM | MIN | MAX]
描述: 计算多个有序集合(Sorted Set)并集并将结果存储到一个新的有序集合中的命令。与 ZUNION 不同的是,ZUNIONSTORE 会将结果存储在指定的目标键中,而不是直接返回给客户端。
ZINTER/ZINTERSTORE
ZINTER numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM | MIN | MAX] [WITHSCORES]
描述: 计算多个有序集合(Sorted Set)交集的命令。它会找出多个有序集合中共同存在的成员,并根据指定的规则计算这些成员的分数。计算的结果会直接返回给客户端。
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM | MIN | MAX]
描述: 计算多个有序集合(Sorted Set)交集并将结果存储在新的有序集合中的命令。与 ZINTER 不同,ZINTERSTORE 不返回结果给客户端,而是将结果存储到指定的目标键中。
参数说明:
- numkeys: 要进行计算的有序集合的数量。
- destination: 结果存储的目标键名。
- [WEIGHTS weight [weight …]]: 可选参数,指定每个集合的权重,用于调整集合中元素分数的计算方式。默认情况下,所有集合的权重为 1。
默认情况下,所有集合的权重为 1。
通过设置权重,可以调整每个集合中元素的分数。例如,如果权重为 2,则该集合中每个元素的分数会乘以 2。 -
SUM(默认):将所有集合中相同成员的分数相加。 MIN:取所有集合中相同成员的最小分数。 MAX:取所有集合中相同成员的最大分数。
6. 位图(Bitmap)
描述:Redis 的位图(Bitmap)是一种基于字符串(String)类型的特殊数据类型,主要用于对单个二进制位进行操作。尽管 Redis 没有专门的位图类型,但它允许你在字符串类型的值上按位操作,从而实现位图操作的效果。Bitmap 实际上是一个能够操作位的数据结构。每个位只占用一位内存空间,对于大规模布尔值数据的存储非常高效。
应用:可以用于实现布隆过滤器、位标志(如活跃用户标志)等。
6.1 设置操作
SETBIT 命令
SETBIT key offset value
描述: 在 Redis 中,位图(Bitmap)操作是基于字符串类型的。由于 Redis 没有专门的位图数据类型,所谓的“添加”操作通常指向字符串中的特定位置设置某个位的值。
将存储在键 key 的字符串值的指定 offset 处的位设置为 value(0 或 1)。返回指定位置原来存储的位的值(0 或 1)。
注: 这里的“位”是指字符的二进制位,而不是字符在字符串中的位置。如果设置的位超出了当前字符串的长度,Redis 会自动扩展字符串以适应这个新的位。新增的部分(从原始长度到新设置的位置之间)将被填充为 0。
示例
假如有个 key 键为 a, 值为字符串 hello, 执行 “SETBIT a 2 0” 会发生什么呢?
- 字符串的初始状态:
字符串 “hello” 由 5 个字符组成,每个字符在计算机中都是以其 ASCII 编码的形式存储的。例如:
h 的 ASCII 值是 104,对应的二进制为 01101000
e 的 ASCII 值是 101,对应的二进制为 01100101
l 的 ASCII 值是 108,对应的二进制为 01101100
o 的 ASCII 值是 111,对应的二进制为 01101111
因此,字符串 “hello” 在内存中的二进制表示为:
01101000 01100101 01101100 01101100 01101111
- 位图操作:
“SETBIT a 2 0” 会将字符串 “hello” 的第 2 位(从 0 开始计数)设置为 0。
第 2 位属于第一个字符 h,其原始二进制表示是 01101000。其中第 2 位为 1。
执行 SETBIT a 2 0 后,h 的二进制会从 01101000 变为 01001000。
这样,字符 h 就从 01101000(ASCII 值 104)变为 01001000(ASCII 值 72),也就是字符 H。
- 字符串结果:
整体字符串的二进制表示会变为:
01001000 01100101 01101100 01101100 01101111
转换回字符后,字符串将从 “hello” 变为 “Hello”。
BITOP 命令
BITOP AND | OR | XOR | NOT destkey key [key ...]
描述: 对一个或多个键的字符串值执行位操作,并将结果存储在目标键 destkey 中。
参数说明:
- AND | OR | XOR | NOT:
AND: 按位与操作。
OR: 按位或操作。
XOR: 按位异或操作。
NOT: 按位取反操作(只能用于单个键)。 - destkey: 目标健。
6.2 查询操作
GETBIT 命令
GETBIT key offset
描述: 返回存储在键 key 的字符串值的二进制位 offset 处的值。返回 0 或 1。
BITCOUNT 命令
BITCOUNT key [start end [BYTE | BIT]]
描述: 统计存储在键 key 中的字符串值的比特位(bit)为 1 的数量。可以通过 start 和 end 参数指定计算的范围(以字节或比特为单位)。
参数说明:
- start: (可选)统计范围的起始位置,默认从字符串的第一个字节开始(索引从 0 开始)。
- end: (可选)统计范围的结束位置,默认到字符串的最后一个字节。
- BYTE | BIT: (可选)表示 start 和 end 参数的单位。如果省略该参数,默认单位是 BYTE。
BITPOS 命令
BITPOS key bit [start [end [BYTE | BIT]]]
描述: 查找键 key 的字符串值中,第一个设置为指定 bit(0 或 1)的位的位置。可以指定 start 和 end 进行范围查找。
返回值: 返回第一个指定比特位的位置,如果找不到指定的比特位,返回 -1。
参数说明:
- bit: 要查找的位值,可以是 0 或 1。
6.3 其它操作
BITFIELD 命令
BITFIELD key [GET encoding offset | [OVERFLOW WRAP | SAT | FAIL] SET encoding offset value | INCRBY encoding offset increment [GET encoding offset | [OVERFLOW WRAP | SAT | FAIL] SET encoding offset value | INCRBY encoding offset increment ...]]
描述: 执行更复杂的位域(bitfield)操作,允许在字符串值的任意位置执行 GET、SET 和 INCRBY 操作。可选的 OVERFLOW 子命令控制溢出处理方式。
参数说明:
- BITFIELD 命令的三种子命令:
这些子命令可以组合在一起执行多个操作:
a. GET encoding offset: 从字符串的指定偏移量 offset 处,按照给定的 encoding(编码)读取并返回一个整数值。
示例: GET i8 0 表示从偏移量 0 处读取一个 8 位带符号整数。
b. SET encoding offset value: 在字符串的指定偏移量 offset 处,将位域设置为指定的 value,编码方式为 encoding。
示例: SET u4 0 15 表示在偏移量 0 处,将一个 4 位无符号整数设置为 15。
c. INCRBY encoding offset increment: 对指定偏移量 offset 处的位域值按 increment 的大小进行递增操作。操作的编码方式由 encoding 指定。
示例: INCRBY i5 100 1 表示对偏移量 100 处的一个 5 位带符号整数加 1。
-
encoding: 定义了操作位域的编码格式和长度。编码格式包括:
i: 带符号整数,其中 表示位数(如 i8 表示 8 位带符号整数)。
u: 无符号整数,其中 表示位数(如 u4 表示 4 位无符号整数)。
f: 浮点数类型(目前 Redis 不支持这个编码)。 -
offset: 指定位域操作的起始偏移量,单位是比特位(bit)。offset 可以是绝对偏移量,也可以相对于当前字节的偏移量,如 #0 表示从当前字节的起始处计算。
示例: 0 表示从第一个比特位开始,8 表示从第二个字节的第一个比特位开始。 -
value: 对于 SET 子命令,value 是要写入到指定偏移量的整数值。
-
increment: 对于 INCRBY 子命令,increment 是要增加的值,可以为正数或负数。
-
OVERFLOW WRAP | SAT | FAIL: 用于控制 INCRBY 子命令的溢出行为。只有在 INCRBY 操作之前指定时有效:
WRAP: 环绕模式,即在溢出时从最小值回绕到最大值(例如,对 4 位无符号整数,15 + 1 将回绕到 0)。
SAT: 饱和模式,溢出时将值限制在最小值或最大值范围内(例如,对 4 位无符号整数,15 + 1 将保持为 15)。
FAIL: 失败模式,发生溢出时操作会失败。
如果不指定 OVERFLOW 子命令,INCRBY 操作将使用默认的 WRAP 模式。
使用场景:
位域存储: 在一个字符串中高效存储和操作多个小整数,这种方式通常用于节省空间。
高效计数器: 使用 INCRBY 实现高效计数器,适合高性能需求的应用场景。
状态标记: 可以用于复杂的状态标记,结合位操作可以实现非常高效的状态管理。
7. HyperLogLog
Redis 的 HyperLogLog 是一种概率数据结构,用于估算一个集合中唯一元素的基数(即去重后的元素数量)。相比传统的 Set 数据结构,HyperLogLog 占用的内存非常少,即使是在处理非常大的数据集时,它的内存使用通常也固定在 12 KB 左右。虽然类似于 Set,但它不会存储实际的元素,而是基于哈希值更新内部的数据结构。
HyperLogLog 的主要特点
内存效率:HyperLogLog 在内存使用上非常高效,即使处理数百万个元素,也只需要大约 12 KB 的内存。
估算结果:HyperLogLog 并不存储实际的元素集合,而是通过概率算法估算基数,允许一定程度的误差(通常误差率在 0.81% 左右)。
适用场景:HyperLogLog 适用于大数据场景下需要估算去重元素数量的情况,比如统计独立用户数、独立 IP 数等。
误差与适用性
误差率:HyperLogLog 的估算结果有一定误差,适用于对精度要求不高,但数据量极大的场景。
内存使用:适合用于需要处理大量数据且内存敏感的场景,如日志分析、网站统计等。
7.1 添加操作
PFADD 命令
PFADD key [element [element ...]]
7.2 查询操作
PFCOUNT 命令
PFCOUNT key [key ...]
查询操作的特点:
- 基数估算:PFCOUNT 返回的是集合中唯一元素的估算值,而不是精确值。该估算通常有小于 1% 的误差。
- 合并查询:当 PFCOUNT 作用于多个键时,它会将这些键对应的 HyperLogLog 结构合并后返回合并后的基数估算值。
- 适用性:PFCOUNT 在数据规模非常大时依然能高效运行,是在需要统计去重元素数量时的理想选择。
总结: Redis 的 PFCOUNT 命令让你能够快速、低成本地获取集合的基数估算值,即使是面对超大规模的数据集。结合 PFADD 命令,Redis 的 HyperLogLog 提供了一个内存友好的解决方案来处理去重计数任务。
7.3 合并操作
PFMERGE destkey [sourcekey [sourcekey ...]]
描述: PFMERGE 是 Redis 中用于合并多个 HyperLogLog 数据结构的命令。通过这个命令,你可以将多个 HyperLogLog 的基数估算合并到一个新的 HyperLogLog 中。合并后的结果仍然是一个 HyperLogLog 数据结构,它估算的基数包含所有源 HyperLogLog 的元素。
参数说明:
- destkey:目标 HyperLogLog 键,用于存储合并后的结果。如果这个键已经存在,将会被覆盖。
- sourcekey [sourcekey …]:一个或多个需要合并的源 HyperLogLog 键。
8. 地理空间索引(Geospatial)
描述:Redis 提供了一种名为 GEO 的数据结构,用于处理地理空间数据。这个数据类型允许你存储地理位置(即经纬度坐标)并对这些位置执行各种地理空间操作,如计算距离、查找附近的点、排序等。Redis 的地理空间索引数据类型基于 sorted sets(有序集合),并利用了 Geohash 算法来实现高效的地理空间查询。
8.1 添加操作
GEOADD 命令
GEOADD key [NX | XX] [CH] longitude latitude member [longitude latitude member ...]
参数说明:
- key: 存储地理空间数据的 Redis key。
- longitude: 经度,必须在 -180 到 180 之间。
- latitude: 纬度,必须在 -85.05112878 到 85.05112878 之间。
- member: 地理位置的名称或标识符。
- [NX | XX]: NX 选项表示只有当 member 不存在时才添加。如果 member 已经存在,则不会更新该位置的数据。
XX 选项表示只有当 member 存在时才更新。如果 member 不存在,则不会添加该位置的数据。 - [CH]: CH 选项表示返回变更数量。当使用 CH 选项时,命令的返回值将表示受影响的成员数量,包括新增的成员和更新的成员。
8.2 查询操作
GEOPOS 命令
GEOPOS key [member [member ...]]
描述: 用于获取一个或多个地理位置的经纬度坐标的命令。它从指定的 key 中获取存储的成员(member)的地理位置信息,并返回对应的经度和纬度。
参数说明:
- member: 想要获取其经纬度坐标的地理位置成员。你可以一次性查询多个成员。
GEODIST 命令
GEODIST key member1 member2 [M | KM | FT | MI]
描述: 返回两个成员之间的距离。
参数说明:
- member1: 第一个地理位置成员的标识符。
- member2: 第二个地理位置成员的标识符。
- M: 表示距离以米为单位返回(默认值)。
KM: 表示距离以公里为单位返回。
FT: 表示距离以英尺为单位返回。
MI: 表示距离以英里为单位返回。
GEOHASH 命令
GEOHASH key [member [member ...]]
描述: Redis 中用于获取一个或多个地理位置的 Geohash 编码的命令。Geohash 是一种空间索引方法,通过将经纬度坐标转换为一个字符串表示,能够将二维地理位置编码为一维的字符串,同时保持地理位置的相对接近性。Geohash 的字符串越长,编码的精度越高。
Geohash 的特点:
- 紧凑表示: Geohash 将二维的经纬度信息编码为一个字符串,便于存储和索引。
- 相对接近性: 相邻的地理位置通常会具有相似的 Geohash 编码,这使得 Geohash 特别适合用于地理空间查询和邻近性查找。
- 精度与长度: Geohash 的长度与地理位置的精度相关。编码字符串越长,表示的地理位置越精确。通常情况下,12 个字符的 Geohash 精度在米级别。
- 分层结构: Geohash 的分层结构意味着你可以通过截断编码来降低精度,从而得到更大区域的编码。
使用场景:
- 地理位置索引: GEOHASH 提供了一种简洁而有效的方式来索引地理位置,特别是在构建邻近搜索、范围搜索等地理空间应用时。
- 地理位置可视化: 在某些应用中,GEOHASH 可以用于在地图上显示地理位置的聚合信息,因为它能够将地理位置转换为单一字符串。
- 调试和验证: 在调试或验证地理位置数据时,GEOHASH 是一种便捷的工具,可以快速检查地理位置是否正确编码和存储。
GEORADIUS/GEORADIUSBYMEMBER 命令
GEORADIUS key longitude latitude radius M | KM | FT | MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC] [STORE key | STOREDIST key]
描述: 用于查找给定地理位置(指定经度和纬度)周围指定半径范围内的地理位置成员的命令。该命令可以返回符合条件的成员列表,并提供一些额外的选项来返回距离、坐标等详细信息。
GEORADIUSBYMEMBER key member radius M | KM | FT | MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC] [STORE key | STOREDIST key]
描述: 查找某个地理位置成员周围指定半径范围内其他地理位置成员的命令。与 GEORADIUS 类似,GEORADIUSBYMEMBER 以某个成员的位置作为中心点,而不是直接指定经纬度坐标。
参数说明:
-
longitude 和 latitude:查询中心点的经度和纬度,确定从哪个位置开始进行搜索。
-
member: 指定为中心点的地理位置成员名称。命令将以此成员的位置为中心点,进行搜索。
-
radius: 搜索半径,即从中心点向外扩展的范围。
-
M | KM | FT | MI: 搜索半径的单位,可以是:
M:米(默认单位)
KM:公里
FT:英尺
MI:英里 -
[WITHHASH]: 返回每个匹配成员的 Geohash 值。这是一个 52 位的有符号整数,表示成员的地理位置。
-
[COUNT count [ANY]]: 限制返回的匹配成员的数量。
count: 限制返回的成员数量为指定的数目。
ANY: 随机返回 count 个结果,而不是按距离排序。这在数据量大时能够提高查询效率。 -
ASC | DESC: 按与中心点的距离进行排序:
ASC: 从近到远排序(默认)。
DESC: 从远到近排序。 -
[STORE key | STOREDIST key]:
STORE key: 将查询结果的成员名称(不包括距离或坐标)存储到指定的 key(Sorted Set)中,按与中心点的距离进行排序。
STOREDIST key: 将查询结果的成员名称和距离存储到指定的 key(Sorted Set)中,分值为与中心点的距离。
GEOSEARCH 命令
GEOSEARCH key FROMMEMBER member | FROMLONLAT longitude latitude BYRADIUS radius M | KM | FT | MI | BYBOX width height M | KM | FT | MI [ASC | DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH]
描述: 用于查找地理空间索引中的成员的命令。与 GEORADIUS 和 GEORADIUSBYMEMBER 类似,但 GEOSEARCH 提供了更灵活的搜索方式,允许使用矩形区域(通过宽度和高度)或圆形区域(通过半径)来搜索地理位置成员。
参数详解:
- key: 存储地理空间数据的 Redis key,通过 GEOADD 命令创建和维护。
- key FROMMEMBER member | FROMLONLAT longitude latitude:
FROMMEMBER member: 使用指定成员的地理位置作为搜索的中心点。
FROMLONLAT longitude latitude: 使用指定的经度和纬度坐标作为搜索的中心点。 - BYRADIUS radius M | KM | FT | MI | BYBOX width height M | KM | FT | MI:
BYRADIUS radius M | KM | FT | MI: 指定一个圆形区域进行搜索。
BYBOX width height M | KM | FT | MI: 指定一个矩形区域进行搜索。
radius: 搜索半径。
width: 矩形区域的宽度。
height: 矩形区域的高度。
M: 米(默认单位)。
KM: 公里。
FT: 英尺。
MI: 英里。 - ASC: 从近到远排序(默认)。
DESC: 从远到近排序。 - [COUNT count [ANY]]: 限制返回的匹配成员的数量。
count: 限制返回的成员数量为指定的数目。
ANY: 随机返回 count 个结果,而不是按距离排序。这在数据量大时能够提高查询效率。 - [WITHHASH]: 返回每个匹配成员的 Geohash 值。Geohash 是一个 52 位的有符号整数,表示成员的地理位置。
GEOSEARCHSTORE 命令
GEOSEARCHSTORE destination source FROMMEMBER member | FROMLONLAT longitude latitude BYRADIUS radius M | KM | FT | MI | BYBOX width height M | KM | FT | MI [ASC | DESC] [COUNT count [ANY]] [STOREDIST]
描述: 用于地理空间查询的命令,它不仅允许查找符合条件的地理位置成员,还能够将查询结果存储到一个新的或现有的 Sorted Set 中。它是 GEOSEARCH 的扩展,增加了结果存储功能。
参数说明:
- destination: 查询结果存储的目标 Sorted Set 的 key。该 key 将保存匹配成员,按距离进行排序。如果 STOREDIST 被指定,分值为成员与中心点的距离。
- source: 存储地理空间源数据的 key,通过 GEOADD 命令创建和维护。
- [STOREDIST]: 将查询结果存储到 destination 中,Sorted Set 中的分值为与中心点的距离。未指定 STOREDIST 时,分值为 0。
其余参数说明与 GEOSEARCH 相同
9. 流(Stream)
描述:Redis Stream 是 Redis 5.0 引入的一种强大且灵活的数据类型,用于处理消息流数据。它结合了发布/订阅模式(Pub/Sub)的实时性和持久性队列的持久性,是事件驱动架构、日志系统、消息队列等场景的理想选择。
Redis Stream 基本概念
- Stream(流): Stream 是一种按时间顺序存储的消息队列,每条消息都有一个唯一的 ID,按时间顺序递增。
- Entry(条目): 每条消息是一个键值对的集合,类似于 Redis 的哈希(Hash)结构。
每个条目由一个唯一的 ID 和一个与之关联的字段-值对(field-value pairs)构成。 - Entry ID: ID 是唯一标识符,由两个部分组成:时间戳(毫秒级)和序列号(在同一毫秒内的递增序列号)。ID 的格式是 timestamp-sequence,如 1527846882379-0。
- Consumer Group(消费者组): Stream 支持多个消费者读取消息,消费者组可以协调多个消费者分布式地处理消息。每个消费者组可以由多个消费者组成,每个消费者会读取自己独立的一部分消息。
1. 添加命令:
XADD 命令
XADD key [NOMKSTREAM] [MAXLEN | MINID [= | ~] threshold [LIMIT count]] * | id field value [field value ...]
描述: XADD 是 Redis Stream 中用S于添加新条目的命令。它可以将新的消息条目插入到指定的 Stream 中,并可以通过多个可选参数控制 Stream 的行为,如限制 Stream 长度、防止创建新 Stream 等。
参数说明:
- key: Stream 的名称。指定在哪个 Stream 中添加消息。如果该 Stream 不存在,通常会创建一个新的 Stream。
- [NOMKSTREAM]: 当指定 NOMKSTREAM 时,如果目标 Stream 不存在,XADD 命令将返回一个错误,而不是创建一个新的 Stream。这在不希望无意中创建 Stream 时非常有用。
- [MAXLEN | MINID [= | ~] threshold [LIMIT count]]:
MAXLEN [= | ~] threshold: 用于限制 Stream 的最大长度。当 Stream 的长度超过 threshold 时,Redis 会自动删除旧的条目以保持 Stream 的长度不超过这个值。
threshold: Stream 的最大条目数量。(Stream 的最大长度默认是无限制的)
MINID [= | ~] threshold: 限制 Stream 中最小的 ID。Redis 会删除那些 ID 小于 threshold 的条目。
threshold: 最小 ID 的值,格式为类似 1527846882379-0。
[= | ~]: 选择符, = 表示精确修剪,性能较慢;~ 表示近似修剪,性能更好,但结果可能不完全精确。
[LIMIT count]: 与 MAXLEN 或 MINID 一起使用,用于限制修剪操作中每次最多删除的条目数。通过限制删除的条目数,能够控制修剪操作对性能的影响。 -
- | id:
*: 由 Redis 自动生成唯一的消息 ID。使用 * 表示 ID 由 Redis 分配,如果要手动指定 ID,可以替换 * 为实际的 ID。
id: 可选参数,用于手动指定消息的 ID。如果不使用 *,则需指定该 ID,格式为 timestamp-sequence,如 1527846882379-0。
- | id:
- field value: 一对或多对字段和值,表示消息的实际内容。一个消息可以包含多个字段及其对应的值。
XINFO 命令
获取 Stream 的详细信息
XINFO STREAM key [FULL [COUNT count]]
获取 Stream 上所有消费者组信息
XINFO GROUPS key
获取 Stream 和消费者组中所有消费者信息
XINFO CONSUMERS key group
显示有关 XINFO 命令及其子命令的帮助信息
XINFO HELP
参数说明:
- [FULL COUNT count]
FULL: 可选参数,如果指定此参数,会返回 Stream 的详细信息。
COUNT count: 可选参数,仅在 FULL 模式下使用,用于限制返回的条目数。 - key: Stream 的名称。
- group: 消费者组的名称。
XREAD 命令
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]
描述: 从一个或多个 Redis Stream 中读取消息。该命令可以阻塞等待新消息的到来,并支持从指定的消息 ID 开始读取。它是处理实时数据流的关键命令。
参数说明:
- COUNT count:用于限制返回的消息数量。count 表示在每个 Stream 中最多返回的条目数。如果未指定 COUNT,Redis 将返回尽可能多的消息(取决于消息的可用性)。
- [BLOCK milliseconds]: 指定以毫秒为单位的阻塞时间。如果当前没有可读取的消息,命令会阻塞等待指定的时间,直到有新消息到来或超时。如果指定为 0,表示永远阻塞,直到有新消息。该参数适合在需要实时处理消息的场景中使用。
- STREAMS key [key …]: 指定一个或多个 Stream 的键名。这是从哪里读取消息的源。你可以同时指定多个 Stream,从每个 Stream 中读取消息。
- id [id …]: 为每个 Stream 指定从哪个消息 ID 开始读取。
具体 ID: 例如:1527846882379-0, 指定从某个特定的消息 ID 开始读取。
0: 表示从 Stream 的开头开始读取所有可用消息, d。
: 从 Stream 中读取尚未被读取的新消息(在消费者组中常用来处理新消息)。
$: 表示从当前 Stream 中的最新消息之后开始读取。通常用于阻塞读取,表示只读取新的消息,而不包括已经存在的消息。
XRANGE 命令
XRANGE key start end [COUNT count]
描述: 用于从 Redis Stream 中按顺序读取指定范围内的消息。它允许根据消息的 ID 进行过滤,读取从 start 到 end 之间的消息。你还可以通过 COUNT 参数限制返回的消息数量。
参数说明:
- start: 起始消息 ID。表示从哪个消息 ID 开始读取,可以是具体的消息 ID、-、或其他合法的 ID 表达式。使用 - 表示从 Stream 的最早消息开始。
- end: 结束消息 ID。表示读取到哪个消息 ID 为止,可以是具体的消息 ID、+、或其他合法的 ID 表达式。使用 + 表示一直读取到 Stream 中的最新消息。
- COUNT count: 用于限制返回的消息数量。count 是一个正整数,表示最多返回多少条消息。如果未指定 COUNT,则返回符合条件的所有消息。
XGROUP 命令
创建消费者组
XGROUP CREATE key group id | $ [MKSTREAM] [ENTRIESREAD entries-read]
描述: 命令用于在 Stream 上创建一个新的消费者组。
重置消费者组起始ID
XGROUP SETID key group id | $ [ENTRIESREAD entries-read]
用于重置 Stream 消费者组的起始 ID。这意味着,可以通过此命令更改消费者组的开始读取位置,或者重置读取状态。这个命令在需要更改消费者组的读取逻辑或重新处理消息时非常有用。
删除消费者组
XGROUP DESTROY key group
描述: 删除 Stream 中的一个消费者组。
删除消费者组中的某个消费者
XGROUP DELCONSUMER key group consumer
描述: 用于从Stream 的消费者组中删除一个指定的消费者。这个操作不会删除消费者组或 Stream 中的消息,只是移除某个消费者及其相关的待处理消息记录。
参数说明:
- group: 新消费者组的名称。消费者组的名称在同一个 Stream 内必须唯一。
- id | $: 指定消费者组的起始 ID。
id: 消费者组将从此指定的消息 ID 开始读取消息。
0: 消费者组将从 Stream 的最早消息开始读取。
$: 消费者组将从 Stream 的最新消息开始读取(即只读取新消息)。 - [MKSTREAM]: 如果指定的 Stream 不存在,添加 MKSTREAM 参数将创建一个空的 Stream。如果没有此选项且 Stream 不存在,将返回错误。
- entries-read:一个整数,表示该组已经读取的消息数量。
- consumer: 消费者组中的某个消费者。
XREADGROUP 命令
XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] id [id ...]
描述: XREADGROUP 命令是 Streams 的一个强大工具,允许消费者组中的消费者读取消息。这与 XREAD 命令类似,但 XREADGROUP 专门用于从消费者组中读取消息,并且在消费时会自动分配消息给消费者。
参数说明:
- GROUP group consumer:
- GROUP: 关键字,用于指示你要使用消费者组来读取消息。
- group: 消费者组的名称。指定要从哪个消费者组中读取消息。
- consumer: 消费者的名称。指定哪个消费者将读取消息,这个消费者会被分配消息并记录在消费者组中。
-
count: 一个整数,表示一次性最多返回的消息数量。
- [BLOCK milliseconds]: 设置阻塞时间,以毫秒为单位。如果 Stream 中没有新消息,客户端可以选择阻塞一段时间等待消息。如果时间内没有消息到达,返回空结果。
milliseconds: 一个整数,表示等待新消息的最大时间。设置为 0 表示不阻塞(立即返回)。 - [NOACK]: NOACK 是 XREADGROUP 命令中的一个可选参数,它控制消息读取后的处理行为。通常情况下,当一个消费者从消费者组中读取消息时,这些消息会被自动加入到 PEL 中,然后均需要被手动确认(使用 XACK 命令)以从待处理列表中移除。如果使用 NOACK 参数,读取到的消息不会被加入 PEL 中,这等同于自动确认了消息。使用 NOACK 的情况下,Redis 不会为这些消息保留待处理状态,这意味着如果消费者处理失败或崩溃,这些消息将不会被重新分配或重试。
- STREAMS key [key …] id [id …]:
STREAMS: 关键字,用于指定从哪些 Stream 读取消息。
key [key …]: Stream 的名称列表。可以从多个 Stream 中读取消息。
id [id …]: 每个 Stream 的起始 ID,通常为消费者组的 ID。
具体 ID: 从指定的消息 ID 开始读取。: 它会读取那些未被任何消费者处理过的消息,这些消息被视为新消息。
0: 尝试从 Stream 的起始位置开始,读取消费者组中已被读取, 但是未被 ack 确认的消息。并且也不会读取新的消息。如果是刚创建的消费者组, 则不会返回任何数据。因为 Redis 会将 Stream 中的所有之前的数据均视为已经被处理过了,所以不会再返回这些消息。对于一个新创建的消费者组,这个消费者组的上下文是空的。
待处理列表(Pending Entries List):
在 Redis Streams 中,待处理列表(Pending Entries List,PEL)是用于跟踪每个消费者组中已被分配但尚未被确认(acknowledged)的消息的列表。当消息通过 XREADGROUP 命令被某个消费者读取时,Redis 会将这些消息添加到消费者组的待处理列表中。每个消费者都有自己的一部分待处理列表,用于跟踪分配给它但尚未确认的消息。
主要特点:
- 跟踪未确认消息: 待处理列表跟踪的是已经发送给消费者但还没有被处理完成或确认的消息。消息会在被消费者读取时加入 PEL 中。
- 消息的重试机制: 如果一个消费者崩溃或无法处理消息,另一个消费者可以从 PEL 中重新领取并处理这些消息。
- 消费确认: 一旦消费者成功处理了消息,需要使用 XACK 命令手动确认该消息,这会将其从 PEL 中移除。如果使用 NOACK 参数, 则会认为是自动确认。
消费逻辑:
- 消息读取: 当一个消费者组中的消费者使用 XREADGROUP 命令读取消息时,这些消息会被标记为已读取,但尚未被确认。消息会被记录在消费者组的 Pending Entries List (PEL) 中,这个列表追踪了消费者已经读取但尚未确认的消息。
- 消息确认: 在消费者处理完消息后,需要使用 XACK 命令确认(acknowledge)消息已经被成功处理。一旦消息被 XACK,它就从 Pending Entries List 中移除,并被视为已处理。
XACK 命令
XACK key group id [id ...]
描述: 用于从指定消费者组的待处理消息列表中删除一条或多条消息。这意味着这些消息已被成功处理,消费者确认了这些消息的处理结果,因此它们可以从待处理消息列表中移除。
参数说明:
- group: 消费者组的名称。
- id [id …]: 一个或多个消息 ID,需要确认的消息。
XPENDING 命令
XPENDING key group [[IDLE min-idle-time] start end count [consumer]]
描述: 获取指定消费者组中已经被读取, 但是未 XACK 确认的消息的详细信息。它可以返回该消费者组中所有消费者的概览信息,还可以根据消息 ID 范围或指定消费者查询更详细的待处理消息列表。
参数说明:
- group: 消费者组的名称。
- [[IDLE min-idle-time] start end count [consumer]]:
[IDLE min-idle-time]: 可选参数,筛选出空闲时间大于等于 min-idle-time(毫秒)的消息。
start: 起始消息 ID,指定待处理消息的起始范围。
end: 结束消息 ID,指定待处理消息的结束范围。
count: 返回的最大消息数量。
[consumer]: 可选参数,指定某个消费者,只返回该消费者的待处理消息。
XCLAIM 命令
XCLAIM key group consumer min-idle-time id [id ...] [IDLE ms] [TIME unix-time-milliseconds] [RETRYCOUNT count] [FORCE] [JUSTID] [LASTID lastid]
描述: 用于重新分配或重新获取挂起消息的命令。它允许消费者组中的一个消费者“声明”由另一个消费者读取但尚未确认(ACK)的消息。以下是 XCLAIM 命令的详细说明:
参数说明:
- group:消费者组的名称。
- consumer:重新分配的消费者的名称。
- min-idle-time:最小空闲时间(以毫秒为单位)。该参数决定了只有那些被挂起超过这个时间的消息才会被重新声明。
例如,如果设置为 5000,只有那些已经被挂起了至少 5 秒钟的消息才会被重新声明。 - id [id …]:一个或多个消息 ID,这些消息是待重新声明的目标。
- [IDLE ms]: 通过此选项,可以将重新声明的消息的空闲时间设置为指定的毫秒数。默认情况下,消息的空闲时间是自最后一次被读取起的时间, 重新声明后理论为0, 但是可以将其设置为其他值,以满足特殊的业务需求。比如可以将空闲时间设置为更大的值可能使消息更早地被重新声明和处理。
- [TIME unix-time-milliseconds]: 将消息的时间戳设置为指定的 Unix 时间戳(以毫秒为单位)。通常用于将消息的时间戳设置为消息的实际生成时间。
- [FORCE]: 如果指定该选项,即使消息当前未被其他消费者读取(即,消息不在 Pending Entries List 中),也会将其强制添加到指定消费者的待处理列表中。这通常用于处理一些特殊场景,比如强制声明消息。
- [JUSTID]: 如果使用这个选项,XCLAIM 将只返回消息的 ID,而不是完整的消息内容。这在只需要知道消息是否成功重新声明的情况下非常有用。
- [LASTID lastid]: 如果指定了这个选项,它将消费者组的 last-delivered-id 更新为提供的 lastid,这通常用于确保消费者组保持消息顺序一致。
常见应用场景:
- 消费者崩溃或失联:当一个消费者读取了消息但未能及时 ACK,且该消费者可能已经崩溃或长时间失联,其他消费者可以使用 XCLAIM 重新声明这些消息,以确保消息不会丢失。
- 消息处理的容错:通过 XCLAIM,可以让另一个消费者重新处理长时间未被确认的消息,从而提高系统的容错能力。
- 消息重新分配:在需要重新分配消息处理任务的场景下,XCLAIM 是一个非常实用的命令,可以手动干预消息处理流程。
10. 发布/订阅(Pub/Sub)
Redis 的发布/订阅(Pub/Sub)是一种消息传递模式,并不是真正的数据结构,允许发送者(发布者)将消息发送到一个或多个频道,订阅者可以订阅这些频道并接收它们的消息。该机制常用于实时消息传递系统,如聊天应用、通知系统等。
基本概念:
- 频道(Channel): 是消息的载体,发布者可以将消息发送到指定的频道,订阅者则可以订阅感兴趣的频道。
- 发布者(Publisher): 发送消息的一方,将消息发布到指定的频道。
- 订阅者(Subscriber): 接收消息的一方,订阅一个或多个频道以接收消息。
尽管不是真正的数据结构,每种数据结构都有其独特的应用场景,合理选择和使用 Redis 的数据结构,可以极大地提升应用的性能和开发效率。
SUBSCRIBE 命令
SUBSCRIBE channel [channel ...]
描述: SUBSCRIBE 命令是 Redis 发布/订阅(Pub/Sub)模型中的一个核心命令,它允许客户端订阅一个或多个频道(channels),从而接收发布到这些频道的消息。
参数说明:
- channel: 想要订阅的一个或多个频道的名称。
功能详解:
- 订阅频道: 当使用 SUBSCRIBE 命令订阅一个或多个频道时,Redis 会开始将这些频道中的所有消息推送到你的客户端。如果你订阅了多个频道,则会同时接收多个频道的消息。
- 实时接收消息: 一旦订阅成功,客户端会进入阻塞模式,专注于接收从这些频道发布的消息。客户端不能再执行其他 Redis 命令,直到取消订阅(使用 UNSUBSCRIBE 命令)或断开连接。每当有新消息发布到你订阅的频道时,Redis 会立即将消息发送给订阅者。
- 接收到的消息格式: 消息以数组形式返回,包含三个元素:
消息类型(message 表示普通消息,subscribe 表示订阅确认,unsubscribe 表示取消订阅确认)。
频道名称(消息发布的频道)。
消息内容(实际的消息文本或订阅的频道数量)。
注意事项:
- 阻塞模式: SUBSCRIBE 命令会使客户端进入阻塞模式,无法执行其他 Redis 命令,直到取消订阅或断开连接。因此,通常建议使用独立的客户端实例来处理发布/订阅操作。
- 消息丢失: 如果在订阅之前发布了消息,客户端将无法接收到这些消息,因为 Redis Pub/Sub 不会存储历史消息。
PUBLISH 命令
PUBLISH channel message
描述: 用于将消息发送到指定的频道,所有订阅了该频道的客户端都会收到这条消息。
参数说明:
- channel: 指定要将消息发送到的频道名称。
- message: 你要发布的消息内容。
功能详解:
- 消息发布: PUBLISH 命令用于将一条消息发布到指定的频道。频道名称是任意的字符串,你可以自由命名频道。当消息发布时,所有订阅了这个频道的客户端会立即收到这条消息。
- 消息的即时性: PUBLISH 是即时操作。消息会立即发送到所有活跃的订阅者,无论他们是何时订阅的。如果在发布消息时没有订阅者,消息将被丢弃,不会存储在 Redis 中。
- 返回值: PUBLISH 命令返回一个整数,表示有多少个订阅者接收到了这条消息。即这个频道当前有多少个客户端正在订阅。
UNSUBSCRIBE 命令
UNSUBSCRIBE [channel [channel ...]]
描述: 取消客户端对一个或多个频道的订阅。
参数说明:
- channel: 可选参数。指定你要取消订阅的一个或多个频道。如果不指定任何频道,UNSUBSCRIBE 将取消客户端的所有频道订阅。
PSUBSCRIBE 命令
PSUBSCRIBE pattern [pattern ...]
描述: 用于订阅符合指定模式(pattern)的所有频道。与 SUBSCRIBE 命令不同,PSUBSCRIBE 支持模式匹配,这意味着客户端可以订阅一组符合特定模式的频道,而不是单独订阅每个频道。
参数说明:
- pattern: 一个或多个模式字符串。模式字符串可以包含通配符,用于匹配多个频道名称。
通配符:
:匹配任意数量的字符(包括零个字符)。例如,模式 news. 可以匹配 news.sports、news.weather 等。
?:匹配单个字符。例如,模式 news.? 可以匹配 news.1、news.A,但不匹配 news.sports。
PUNSUBSCRIBE 命令
PUNSUBSCRIBE [pattern [pattern ...]]
描述: 取消客户端对一个或多个模式(pattern)的订阅。与 UNSUBSCRIBE 命令类似,但 PUNSUBSCRIBE 是针对模式订阅(即 PSUBSCRIBE 命令订阅的频道模式)的取消操作。
参数说明:
- pattern: 可选参数。指定你要取消订阅的一个或多个模式。如果不指定任何模式,PUNSUBSCRIBE 将取消客户端对所有模式的订阅。
PUBSUB 命令
PUBSUB CHANNELS 子命令
PUBSUB CHANNELS [pattern]
描述: 列出当前活跃的频道,或者匹配指定模式的频道。
PUBSUB NUMSUB 子命令
PUBSUB NUMSUB [channel [channel ...]]
描述: 返回一个列表,显示指定频道当前的订阅者数量。
PUBSUB NUMPAT 子命令
PUBSUB NUMPAT
描述: 返回当前被订阅的模式(通过 PSUBSCRIBE 命令订阅)的数量。
一些通用的命令:
DEL/UNLINK 命令
DEL key [key ...]
描述: 删除一个或多个键及其对应的值,无论这些键的数据类型是什么。
UNLINK key [key ...]
描述: UNLINK 命令与 DEL 类似,用于删除一个或多个键。但与 DEL 不同的是,UNLINK 是异步执行的,删除过程不会阻塞 Redis 主线程。这对于删除大键或大量键时非常有用,因为它可以避免阻塞 Redis 的其他操作。
EXISTS 命令
EXISTS key
描述: 检查键 key 是否存在。返回 1 表示存在,返回 0 表示不存在。
TYPE 命令
TYPE key
描述: 返回指定键的数据类型。可能的返回值包括 string、list、set、zset(有序集)、hash 等。
EXPIRE/PEXPIRE 命令
EXPIRE key seconds [NX | XX | GT | LT]
PEXPIRE key milliseconds [NX | XX | GT | LT]
描述: 用于设置 Redis 中键的过期时间,单位为秒或毫秒。自 Redis 7.0 版本起,增加了可选参数 [NX | XX | GT | LT],用于控制设置过期时间的条件。这些选项提供了更灵活的过期时间管理策略。
参数说明:
- NX: 仅当键当前没有设置过期时间时,才会设置新的过期时间。如果键已经有过期时间,则不做任何操作。
- XX: 仅当键当前已经有过期时间时,才会更新过期时间。如果键没有设置过期时间,则不做任何操作。
- GT: 仅当新设置的过期时间大于当前的剩余时间时,才会更新过期时间。
- LT: 仅当新设置的过期时间小于当前的剩余时间时,才会更新过期时间。
EXPIREAT/PEXPIREAT 命令
EXPIREAT key unix-time-seconds [NX | XX | GT | LT]
描述: 设置键在指定的 Unix 时间戳(以秒为单位)过期。
PEXPIREAT key unix-time-milliseconds [NX | XX | GT | LT]
描述: 设置键在指定的 Unix 时间戳(以毫秒为单位)过期。
TTL/PTTL 命令
TTL key
描述: 返回指定键的剩余存活时间,单位为秒。如果键没有设置过期时间,返回 -1,如果键不存在,返回 -2。
PTTL key
描述: 返回指定键的剩余存活时间,单位为毫秒。如果键没有设置过期时间,返回 -1,如果键不存在,返回 -2。
PERSIST 命令
PERSIST key
描述: 移除键的过期时间,使其永久存在。
RENAME/RENAMENX 命令
RENAME key newkey
描述: 将键 key 重命名为 newkey。如果 newkey 已存在,RENAME 将覆盖它。
RENAMENX key newkey
描述: 将键 key 重命名为 newkey,仅当 newkey 不存在时才执行操作。
MOVE 命令
MOVE key db
描述: 将键从当前数据库移动到指定的数据库 db。如果目标数据库中已存在相同的键,则操作无效。
DUMP/RESTORE 命令
DUMP key
描述: 序列化给定的键,并返回被序列化的值。该值可以使用 RESTORE 命令恢复。
RESTORE key ttl serialized-value [REPLACE] [ABSTTL] [IDLETIME seconds] [FREQ frequency]
描述: 用于将使用 DUMP 命令序列化的键值对恢复到 Redis 数据库中。该命令可以设置恢复键的生存时间以及一些额外的选项,比如替换现有键、使用绝对过期时间、设置空闲时间或访问频率。如果恢复成功,返回 OK。
参数说明:
- ttl: 键的生存时间,以毫秒为单位。如果 ttl 为 0,表示恢复的键将永久存在,不会自动过期。
- serialized-value: 使用 DUMP 命令生成的序列化值。它是一个经过 Redis 内部格式化的二进制字符串,包含了键值的完整内容和元数据。
- REPLACE: 如果目标键已存在,则使用 REPLACE 选项替换现有键。如果不指定 REPLACE,且键已存在,RESTORE 命令将返回错误。
- ABSTTL: 解释 ttl 参数为绝对 Unix 时间戳(以毫秒为单位),而不是相对于当前时间的过期时间。
应用场景: 当需要恢复一个在特定时间点过期的键时使用。 - IDLETIME seconds: 设置键的空闲时间,即自上次访问后的秒数。用于模拟键在某段时间内未被访问的情况。
应用场景: 在恢复数据时,需要保持键的访问历史信息时使用。 - FREQ frequency: 设置键的访问频率信息。这个选项通常用于 Redis 的内存管理和 LRU/LFU 算法。
应用场景: 当需要恢复键的访问频率信息,以影响 Redis 的内存管理策略时使用。
应用场景:
- 数据备份与恢复: 使用 DUMP 和 RESTORE 命令可以备份和恢复 Redis 数据。可以在备份后将序列化数据保存到文件或其他存储系统中,稍后再恢复到 Redis 中。
- 迁移数据: 将一个 Redis 实例中的数据迁移到另一个实例中时,先使用 DUMP 导出数据,再使用 RESTORE 命令将数据导入目标实例。
- 保留元数据: 在恢复数据时,保留和设置键的元数据(如过期时间、访问频率、空闲时间等),确保恢复后的数据与原始数据在行为上保持一致。
- 复杂过期管理: 使用 ABSTTL 选项,可以更灵活地管理键的过期策略,特别是在需要处理固定时间点过期的场景中。
注意事项
- 序列化数据的兼容性: 由于 Redis 版本之间可能存在变化,不同版本的 Redis 生成的 DUMP 数据可能不完全兼容。确保在相同或兼容的版本间使用 DUMP 和 RESTORE。
- 高危操作: RESTORE 命令与 REPLACE 参数配合使用时,可能会无意中覆盖现有的数据,因此在使用时应特别小心。
- 限制: 如果使用 REPLACE 选项,且当前键已存在,RESTORE 操作会删除原来的键,并将其替换为新的数据,这可能影响数据的持久性和一致性。
KEYS 命令
KEYS pattern
描述: 查找匹配给定模式的所有键。注意在生产环境中慎用,因为它会遍历整个数据库。
SCAN 命令
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
描述: 通过游标(cursor)迭代数据库中的键,可以使用 MATCH 选项按模式过滤键,COUNT 选项指定每次迭代的数量。SCAN 命令适合在大型数据集上执行迭代查询,而不会阻塞服务器。
参数说明:
-
cursor: 游标(cursor)是 SCAN 命令的核心参数,用于记录迭代的当前位置。
起始值: 通常为 0,表示从头开始扫描。
返回值: SCAN 命令会返回一个新的游标,当返回的游标为 0 时,表示扫描已经结束。
使用: 在每次调用 SCAN 时,都需要提供上一次调用返回的游标值,以继续遍历。 -
[MATCH pattern]: MATCH 选项用于指定一个模式,用于过滤返回的键。只有匹配该模式的键才会被返回。
模式规则:
*: 匹配任意数量的字符。
?: 匹配单个字符。
[abc]: 匹配括号内的任意一个字符。
[a-z]: 匹配指定范围内的字符。作用: 可以用来筛选特定前缀或格式的键。例如,匹配所有以 user: 开头的键。
SCAN 0 MATCH user:*
-
COUNT count: COUNT 选项用于指定每次迭代返回的最大键数。COUNT 是一个提示,Redis 并不保证每次返回的键数量严格等于 count。
默认值: 10。如果未指定 COUNT,Redis 默认每次返回大约 10 个键。
作用: 提高或降低每次扫描的返回量。对于大数据集,可以增大 count 的值以加快扫描过程;对于小数据集或避免阻塞其他操作,可以使用较小的 count 值。 -
[TYPE type]: TYPE 选项用于筛选出 Redis 中具有特定数据类型的键。Redis 支持多种数据类型,例如字符串、列表、集合、哈希等。通过 TYPE 选项,可以指定只返回某种特定类型的键,而忽略其他类型的键。
TYPE 参数支持的键类型:
string: 普通字符串。
list: 链表。
set: 无序集合。
zset: 有序集合(sorted set)。
hash: 哈希表。
stream: 流数据类型。
module: 模块定义的自定义数据类型。TYPE 不支持参数的类型:
bitmap: 位图实际上是基于字符串类型的扩展,不是独立的键类型。
hyperloglog: HyperLogLog 是一种基于字符串的高级数据结构,因此也不能作为独立的键类型被 TYPE 参数直接使用。
geospatial: 这是基于有序集合(zset)的扩展,也不作为独立的键类型。注: TYPE 参数是 Redis 6.0 及之后的版本新增的功能。
三.redis 应用:
Redis 在各种应用场景中广泛使用,主要利用其高性能、丰富的数据结构和内存存储特性。以下是 Redis 的一些常见应用场景:
1. 缓存
Redis 最常见的用途之一是作为缓存层。由于其速度快,Redis 可以有效减少数据库的访问压力,提高应用的响应速度。常见的缓存应用包括:
页面缓存:缓存渲染后的页面或页面片段,减少服务器端的处理时间。
对象缓存:缓存频繁访问的对象(例如用户会话数据、商品详情等)。
数据库查询结果缓存:缓存复杂的数据库查询结果,避免重复的查询。
2. 会话存储
在分布式系统中,用户的会话数据(如登录状态、用户偏好等)可以存储在 Redis 中。由于 Redis 的速度快、支持过期时间设置,以及持久化选项,它非常适合做会话管理。
3. 排行榜/计数器
Redis 的有序集合(sorted sets)和其他数据结构非常适合用来实现排行榜或计数器系统。常见的应用场景包括:
游戏排行榜:记录玩家的分数并实时更新排名。
内容评分和排名:根据用户的行为(如点赞、分享)实时更新内容的排名。
网站访问统计:实时统计页面访问量、点击量等数据。
4. 消息队列
Redis 支持发布/订阅(Pub/Sub)机制,也可以用列表(List)或流(Stream)来实现简单的消息队列。可以用于:
实时消息传递:例如在聊天应用中,使用 Redis 传递消息。
任务队列:将任务推送到 Redis 列表中,然后由工作进程异步处理。
5. 实时数据分析
Redis 可以存储并实时处理大量数据,用于流式数据的实时分析。例如:
监控和报警系统:实时监控服务器状态,检测异常并触发报警。
实时数据处理:处理和分析实时流数据,如点击流、传感器数据等。
6. 地理位置数据存储
Redis 提供了地理空间索引功能,可以存储和查询地理位置数据。常见应用包括:
定位服务:根据用户的位置,查找附近的兴趣点(如餐馆、商店)。
物流跟踪:实时跟踪和查询物流路径和状态。
7. 分布式锁
Redis 可以通过其原子操作来实现分布式锁。通过设置一个带有过期时间的键,可以确保在分布式系统中某一资源的唯一性访问。
8. 社交网络
Redis 在社交网络中可以用来实现功能如:
粉丝/关注列表:管理用户的关注关系。
新闻推送:基于用户的关注关系和内容的时间顺序推送新闻和更新。
9. 数据过期和淘汰
Redis 支持为键设置过期时间,常用于需要临时存储的数据,例如验证码、临时令牌等。此外,Redis 也有内置的数据淘汰策略,用来自动删除不常用的数据。
10. 全局分布式缓存
在微服务架构中,Redis 可以作为全局缓存层,提供跨多个服务的共享缓存,实现数据的一致性和快速访问。
原文地址:https://blog.csdn.net/xyy1028/article/details/144396034
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!