dot 快速的未来即将在您的城市举办的活动中到来。

加入我们在 Redis 发布会上

Redis 运行缓慢? 以下是您可以采取的措施

点击此处开始使用 Redis Enterprise。 Redis Enterprise 使您能够以任何规模、任何地方处理任何实时数据。

Redis 速度极快,可以轻松处理数十万数百万次每秒的操作(当然,根据您的设置,您的结果可能会有所不同),但在某些情况下,您可能会觉得它性能不佳。 这种操作速度下降 - 或者延迟 - 可能由多种原因引起,但排除了常见问题(即服务器的硬件/虚拟化、存储和网络)之后,您还应检查 Redis 设置,看看哪些可以优化。

首先,您可以通过验证 Redis 服务器的 CPU 负载是否确实在全速运行且没有被阻塞来开始。 如果 Redis 进程稳定在 100%,那么问题可能归因于以下两个原因之一:查询量和/或慢速查询。 优化运行缓慢的查询(在大多数情况下,优化的是底层数据结构)本身就是一门艺术,但在尝试其他措施(如升级硬件或对 Redis 进行集群)之前,您仍然可以尝试一些方法。

检查您的 Redis 的SLOWLOG,确保其中没有特别慢的查询 - 这些查询应该可以通过其较高的执行时间(每个日志条目中的第三个整数)轻松识别。 较高的执行时间意味着较高的延迟,但请记住,Redis 的某些命令(如排序集操作)可能需要更长时间才能完成,具体取决于其参数和它们处理的数据大小。 通过使用 Redis Cloud 的增强版 SLOWLOG 或在脑海中进行计算,您可以进一步深入了解以识别问题所在。

接下来,查看INFO ALL 命令的输出。 利用您的经验、敏锐的判断力和冷静的逻辑来回答这个问题 - 有什么看起来很奇怪吗?🙂 在不跟踪持久性存储网络复制瓶颈的情况下,您应该重点关注统计信息命令统计信息部分。

当统计信息部分中total_connections_received 的值过高时,通常意味着您的应用程序为其发出的每个请求都打开和关闭了一个连接。 打开连接是一个昂贵的操作,会增加客户端和服务器的延迟。 要解决此问题,请查阅 Redis 客户端的文档,并将其配置为使用持久连接。

使用命令统计信息部分中的信息来确定占用服务器大部分资源的命令。 通过用可变参数命令替换命令来寻找简单的解决方案。 Redis 的一些命令(例如 GET、SET、HGET 和 HSET)具有可变参数版本(即分别为 MGET、MSET、HMGET 和 HMSET),而其他命令则直接内置了无限参数(DEL、HDEL、LPUSH、SADD、ZADD 等)。 通过用单个调用替换对同一个命令的多个调用,您将减少宝贵的微秒,同时节省服务器和客户端资源。

如果您在 Redis 数据库中管理着大型数据结构,并且您正在获取所有内容(例如,使用 HGETALL、SMEMBERS 或 ZRANGE),请考虑使用相应的SCAN 命令。 SCAN 迭代 Redis 键的命名空间,应该始终用它来代替“邪恶的”KEYS 命令。 作为额外的好处,SCAN 用于哈希、集合和排序集的变体(HSCAN、SSCAN 和 ZSCAN)还可以帮助您释放 Redis,从而降低总体延迟。

减少 Redis 查询延迟的另一种方法是使用管道。 当您对一组操作进行管道处理时,它们会以一个批次的形式发送,尽管处理起来更大且更慢,但只需要一个请求-响应往返行程。 这种往返行程的整合大大减少了整体延迟。 但是请注意,如果管道操作正在等待回复而没有发送管道,那么它可能会阻塞您的应用程序 - Redis 只有在管道发送之后才会向管道命令流提供所有回复。 还请记住,在使用管道时,Redis 会在将所有回复批量返回给客户端之前,将所有回复缓存在内存中,因此对数千个查询进行管道处理(尤其是那些返回大量数据的查询)可能会对服务器和客户端造成负担。 如果是这种情况,请使用更小的管道大小。

当管道不是一种选择时,您仍然可以通过走“月光”脚本之路来节省往返行程时间 (RTT) 延迟。 通过 Redis 中的Lua 脚本,您可以使用与数据本地交互的逻辑,从而节省许多潜在的客户端-服务器往返行程。 为了进一步减少带宽消耗、延迟并避免脚本重新编译,请确保使用SCRIPT LOADEVALSHA

Lua 提示:避免生成动态脚本,因为这会导致 Lua 缓存增长并失控。 如果您必须使用动态脚本,那么只使用普通的EVAL,因为没有必要先加载它们。 另外,请记住跟踪 Lua 内存消耗,并定期使用SCRIPT FLUSH 清理缓存。 另外,不要在 Lua 脚本中硬编码和/或以编程方式生成键名,因为这样做会使它们在集群 Redis 设置中毫无用处。

这些只是您可以轻松地从 Redis 数据库中获得更多收益而无需使用重型武器的方法。 采用其中任何一个建议都可以产生巨大的影响,并大幅降低延迟。 您是否知道更多技巧? 有任何问题或反馈吗? 请随时联系我,我随时为您提供帮助 🙂