源地址:https://www.digitalocean.com/community/cheatsheets/how-to-troubleshoot-issues-in-redis
作者:Mark Drake

简介

Redis 是一个开源的、运行在内存中的键值数据库。Redis 自带几个命令,可以帮助解决和调试问题。由于 Redis 作为 [in-memory key-value store] (https://en.wikipedia.org/wiki/In-memory_database) 的性质,其中许多命令专注于内存管理,但还有其他一些命令可以帮助提供 Redis 服务器状态的概览。

本教程将详细介绍如何使用其中一些命令来帮助诊断和解决您在使用 Redis 时可能遇到的问题。

如何使用这个教程

这个教程是以小抄(Cheat Sheet)的形式写的,有对应的例子。我们鼓励你直接跳转到和你要完成的任务相关的章节进行阅读。

这个教程中的命令在 Ubuntu 18.04 中的 Redis 4.0.9 版本完成测试。如果你需要建设一个同样的环境,可以参考我们的 如何在 Ubuntu 18.04 上安装并加固 Redis 中的 Step 1 来安装 Redis。我们将通过 Redis 命令行界面redis-cli运行这些命令,来演示这些命令的行为。请注意,如果你使用不同的 Redis 工具--例如Redli —— 某些命令的实际输出可能有所不同。

此外,你还可以使用一个代管的 Redis 数据库实例来测试这些命令。但需要注意的是,根据你的数据库服务提供商的限制,这个教程中的某些命令可能运行效果和教程不一致。如果想要使用 DigitalOcean 提供的代管数据库,可以查看我们的代管数据库产品文档。使用代管 Redis 数据库实例时,你必须安装 Redli设置 TLS 隧道 来通过 TLS 链接到代管数据库。

排查内存相关问题

memory usage 告诉你单个键当前使用了多少内存。它将键的名称作为参数并输出它使用的字节数:

127.0.0.1:6379>  memory usage key_meaningOfLife

输出

 (integer) 42

要更全面地了解 Redis 实例如何使用内存,可以运行“memory stats”命令:

127.0.0.1:6379>  memory stats

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

  • peak.allocated: Redis 消耗的峰值字节数
  • total.allocated: Redis 分配的总字节数
  • startup.allocated: Redis 在启动时消耗的初始字节数
  • replication.backlog: 副本复制积压缓冲区的字节数
  • clients.slaves: 所有副本开销的总大小(输出和查询缓冲区以及连接上下文)
  • clients.normal: 所有客户端开销的总大小
  • aof.buffer: 当前 [append-only file](https://en.wikipedia.org/wiki/Redis#Persistence)缓冲区的总大小
  • db.0: 服务器上使用的每个数据库的主字典和过期字典的开销,以字节为单位报告
  • overhead.total: 用于管理 Redis 键空间的所有开销的总和
  • keys.count: 服务器上所有数据库中存储的键总数
  • keys.bytes-per-key: 服务器的净内存使用量与 keys.count 的比率
  • dataset.bytes: 数据集的大小,以字节为单位
  • dataset.percentage: dataset.bytes 占用 Redis 的净内存使用百分比
  • peak.percentage: peak.allocatedtotal.allocated 的百分比
  • fragmentation: 当前使用的内存量除以 Redis 实际使用的物理内存的比值

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

127.0.0.1:6379>  memory malloc-stats

如果您似乎遇到了与内存相关的问题,但解析前面命令的输出证明没有帮助,您可以尝试运行 memory doctor

127.0.0.1:6379>  memory doctor

此功能将输出它可以找到的任何内存消耗问题并建议潜在的解决方案。

获取你的 Redis 实例的基本信息

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

127.0.0.1:6379>  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,它返回有关服务器的几个信息块和统计信息:

127.0.0.1:6379>  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 的参数:

127.0.0.1:6379>  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 查找匹配模式的键:

127.0.0.1:6379>  keys pattern

pattern 中可以使用如下符合 glob-style 模式的键:

  • ? 是代表任何单个字符的通配符,所以 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 时可能遇到的问题的命令。