源地址: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.allocated
占total.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
匹配sammy
、sommy
和sqmmy
*
是一个通配符,代表任意数量的字符,包括不包含任何字符,所以sa*y
匹配sammy
、say
、sammmmmmy
和salmony
- 您可以指定模式可以包含的两个或多个字符,方法是将它们括在括号中,因此
s[ai]mmy
将匹配sammy
和simmy
,但不匹配summy
- 要设置一个忽略一个或多个字母的通配符,请将它们括在括号中并在它们前面加上一个上箭头 (
^
),因此s[^oi]mmy
将匹配sammy
和sxmmy
,但不匹配sommy
或simmy
- 要设置包含一系列字母的通配符,请用连字符分隔范围的开头和结尾并将其括在括号中,因此
s[a-o]mmy
将匹配sammy
、skmmy
和sommy
,但不是srmmy
警告: Redis 文档 警告说,keys
几乎不应该在生产环境中使用,因为它会对性能产生重大负面影响。
总结
本指南详细介绍了许多有助于故障排除和解决使用 Redis 时可能遇到的问题的命令。