相关教程系列

  1. 如何在 Ubuntu 18.04 上安装和保护 Redis
  2. 如何连接到 Redis 数据库
  3. 如何管理 Redis 数据库和 Keys
  4. 如何在 Redis 中管理副本和客户端
  5. 如何在 Redis 中管理字符串
  6. 如何在 Redis 中管理 List
  7. 如何在 Redis 中管理 Hashes
  8. 如何在 Redis 中管理 Sets
  9. 如何在 Redis 中管理 Sorted Sets
  10. 如何在 Redis 中运行事务
  11. 如何使 Redis 中的 Key 失效
  12. 如何解决 Redis 中的故障
  13. 如何从命令行更改 Redis 的配置
  14. Redis 数据类型简介

介绍

Redis 是一个开源的内存键值存储系统(In-memory Key-Value Store)。它提供了多个命令,可帮助您进行故障排除和调试。由于 Redis 具有 内存数据库 的特性,因此许多命令都集中在内存管理上;但同时还有一些其他命令对于概述 Redis 服务器的状态非常有用。本教程将详细介绍如何使用这些命令来诊断和解决使用 Redis 时可能遇到的问题。

如何使用本指南

本指南以备有完整示例的备忘单形式编写。我们鼓励您直接跳至与您当前任务相关的部分。

本指南中显示的命令已在运行 Redis 4.0.9Ubuntu 18.04 服务器上进行了测试。要设置类似的环境,您可以按照指南 如何在 Ubuntu 18.04 上安装和保护 Redis步骤 1 进行操作。我们将通过 Redis 命令行界面 redis-cli 运行这些命令来演示其行为。请注意,如果您使用其他 Redis 界面(例如 Redli),则某些命令的确切输出可能会有所不同。

另外,您也可以使用托管的 Redis 数据库实例来测试这些命令。但请注意,根据数据库提供者所允许的控制级别,本指南中的某些命令可能无法按所述方式工作。要配置 DigitalOcean 托管数据库,请遵循我们的 托管数据库产品文档。然后,您必须 安装 Redli 设置 TLS 隧道 才能通过 TLS 连接到托管数据库。

对内存相关问题进行故障排除

memory usage 命令告诉您单个键(Key)当前正在使用多少内存。它以键的名称作为参数,并输出其使用的字节数:

memory usage key_meaningOfLife
(integer) 42

为了更全面地了解您的 Redis 服务器如何使用内存,可以运行以下 memory stats 命令:

memory stats

此命令输出与内存相关的指标及其值的数组。以下是 memory stats 报告的主要指标:

  • peak.allocated:Redis 消耗的最大字节数。
  • total.allocated:Redis 分配的总字节数。
  • startup.allocated:Redis 在启动时消耗的初始字节数。
  • replication.backlog:复制积压(Replication Backlog)的大小,以字节为单位。
  • clients.slaves:所有副本(Slave)开销的总大小(包括输出和查询缓冲区以及连接上下文)。
  • clients.normal:所有客户端开销的总大小。
  • aof.buffer:当前和重写 仅附加文件(AOF) 缓冲区的总大小。
  • db.0:服务器上正在使用的每个数据库的主字典和到期字典的开销,以字节为单位报告。
  • overhead.total:用于管理 Redis 密钥空间的所有开销的总和。
  • keys.count:服务器上所有数据库中存储的键总数。
  • keys.bytes-per-key:服务器的净内存使用率与 keys.count 的比值。
  • dataset.bytes:数据集的大小,以字节为单位。
  • dataset.percentagedataset.bytes 占 Redis 净内存使用量的百分比。
  • peak.percentagepeak.allocatedtotal.allocated 的百分比。
  • fragmentation:当前正在使用的内存量除以 Redis 实际使用的物理内存之比。

memory malloc-stats 提供了来自 jemalloc 的内部统计报告,jemalloc 是 Linux 系统上 Redis 默认使用的内存分配器:

memory malloc-stats

如果您似乎遇到了与内存有关的问题,但是解析前面命令的输出证明无济于事,则可以尝试运行 memory doctor

memory doctor

此功能将输出它可以找到的所有内存消耗问题,并提出潜在的解决方案。

获取有关 Redis 实例的常规信息

与内存管理没有直接关系的调试命令是 monitor。此命令使您可以查看 Redis 服务器处理的每个命令的恒定流:

monitor
OK
1566157213.896437 [0 127.0.0.1:47740] "auth" "foobared"
1566157215.870306 [0 127.0.0.1:47740] "set" "key_1" "878"

另一个对调试有用的命令是 info,它返回有关服务器的多个信息和统计信息块:

info
# Server
redis_version:4.0.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:9435c3c2879311f3
redis_mode:standalone
os:Linux 4.15.0-52-generic x86_64
. . .

此命令返回很多信息。如果您只想查看某一个信息块,可以将其指定为 info 的参数:

info CPU
# CPU
used_cpu_sys:173.16
used_cpu_user:70.89
used_cpu_sys_children:0.01
used_cpu_user_children:0.04

请注意,info 命令返回的信息将取决于您所使用的 Redis 版本。

使用 keys 命令

如果您忘记了某个键的名称,或者创建了一个键但意外拼错了它的名称,keys 命令会很有用。keys 用于查找与特定模式匹配的键:

keys pattern

支持以下 Glob 风格通配符:

  • ? 是通配符,代表任何单个字符。例如 s?mmy 匹配 sammysommysqmmy
  • * 是通配符,用来代表任何数量的字符(包括零个字符)。例如 sa*y 匹配 sammysaysammmmmmysalmony
  • 您可以通过将模式括在方括号中来指定模式可以包含的两个或多个字符。例如 s[ai]mmy 匹配 sammysimmy,但不能匹配 summy
  • 要设置一个忽略一个或多个字母的通配符,请将其括在方括号中,并在其前面加上脱字符(^)。例如 s[^oi]mmy 可以匹配 sammysxmmy,但不能匹配 sommysimmy
  • 要设置一个包含一系列字母的通配符,范围的开头和结尾用连字符分开并括在括号内。例如 s[a-o]mmy 将匹配 sammyskmmysommy,但不匹配 srmmy
警告: Redis 官方文档 警告说,keys 命令几乎不应该在生产环境中使用,因为它可能会对性能产生重大的负面影响。

结论

本指南详细介绍了许多可用于故障排除和解决与 Redis 一起使用时可能遇到问题的命令。如果您想在本指南中概述其他相关的命令、参数或过程,请在下面的评论中提出疑问或提出建议。

有关 Redis 命令的更多信息,请参阅关于 如何管理 Redis 数据库的 系列教程。

说明: 本文基于 Redis 4.0.9Ubuntu 18.04 环境编写。较新版本的 Redis 可能在命令输出或特性上有所差异,请以官方文档为准。