如何排除Redis中的问题

介绍

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

如何使用本指南

本指南被编写为一个包含自包含示例的速查表。我们鼓励您跳转到与您要完成的任务相关的任何部分。

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

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

memory usage告诉您一个键当前使用多少内存。它以键的名称作为参数并输出它使用的字节数。首先,设置一个示例变量:

  1. set key_meaningOfLife "Food"

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

  1. memory usage key_meaningOfLife
Output
(integer) 88

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

  1. memory stats

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

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

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

  1. memory malloc-stats

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

  1. memory doctor

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

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

A debugging command that isn’t directly related to memory management is monitor. This command allows you to review a constant stream of every command processed by the Redis server:

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

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

  1. info
Output
# 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的参数:

  1. info CPU
Output
# 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会搜索与模式匹配的密钥:

  1. 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数据库

Source:
https://www.digitalocean.com/community/cheatsheets/how-to-troubleshoot-issues-in-redis