Redis故障排除:常见问题与高效解决方案

引言

Redis是一个开源的内存键值数据存储系统。它带有一些命令,可以帮助解决故障排除和调试问题。由于Redis是一个内存键值存储系统,许多这些命令侧重于内存管理,但也有其他一些命令可以提供有关Redis服务器状态的概述。本教程将详细介绍如何使用其中一些命令来诊断和解决在使用Redis时可能遇到的问题。

如何使用本指南

本指南是一个详细说明了自成一体例子的备忘清单。我们鼓励您直接跳到与您当前任务相关的任何部分。

本指南中展示的命令已在运行Redis版本6.0.16的Ubuntu 22.04服务器上进行了测试。要设置一个类似的环境,您可以按照我们关于在Ubuntu 22.04上安装和保护Redis的指南的第一步进行操作。我们将使用Redis命令行界面redis-cli来运行这些命令,以演示它们的行为。如果您使用不同的Redis界面,例如Redli,某些命令的确切输出可能会有所不同。

或者,您可以提供一个托管的Redis数据库实例来测试这些命令,但根据您的数据库提供商允许的控制级别,本指南中的某些命令可能无法按照描述的方式正常工作。要提供Silicon Cloud托管的数据库,请遵循我们的托管数据库产品文档。然后,您必须安装Redli或设置一个TLS隧道才能通过TLS连接到托管的数据库。

解决与内存相关的问题

memory usage命令可以告诉您当前单个键正在使用的内存量。它以一个键的名称作为参数,并输出其所使用的字节数。首先,设置一个示例变量。

set key_meaningOfLife "Food"

接下来,使用memory usage检查内存。

memory usage key_meaningOfLife
输出
(integer) 88

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

memory stats

这个命令会输出一系列与内存相关的指标及其值。下面是内存统计报告的指标。

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

memory malloc-stats是Redis在Linux系统上使用的内存分配器jemalloc提供的内部统计报告。

memory malloc-stats

如果你似乎遇到了与内存相关的问题,但解析前几个命令的输出并没有帮助的话,你可以尝试运行内存修复工具。

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:6.0.16 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:a3fdef44459b3ad6 redis_mode:standalone os:Linux 5.15.0-41-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 <mark>pattern</mark>

支持以下的字符匹配变量:

  • ? 是一个通配符,代表任意单个字符,例如 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 数据库》。

bannerAds