dot Redis 8 来了——而且是开源的

了解更多

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

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

Redis 非常快,可以轻松处理每秒 数十万数百万 次操作(当然,YMMV 取决于您的设置),但在某些情况下,您可能会觉得它的性能不佳。 操作的这种缓慢——或延迟——可能是由多种原因造成的,但是一旦您排除了通常的嫌疑人(即服务器的硬件/虚拟硬件、存储和网络),您还应该检查您的 Redis 设置,看看可以优化什么。

一个好的起点是验证您的 Redis 服务器的 CPU 负载是否确实以全速运行,而不是以某种方式被阻止。 如果您的 Redis 进程稳定在 100%,那么您的问题可能归因于以下两种情况之一:您的查询量和/或慢查询。 优化慢速运行的查询(以及在大多数情况下是底层数据结构)本身就是一门艺术,但是在尝试升级硬件或集群 Redis 等其他措施之前,您仍然可以尝试很多事情。

查看您的 Redis SLOWLOG 以确保其中没有任何特别慢查询——这些应该很容易通过其高执行时间(每个日志条目中的第三个整数)来识别。 更高的执行时间意味着更高的延迟,但请记住,Redis 的某些命令(例如排序集操作)可能需要更长的时间才能完成,具体取决于它们的参数和它们处理的数据大小。 通过使用 Redis Cloud 的 增强版 SLOWLOG 或在您脑海中进行数学运算,您可以进一步深入研究以识别故障制造者。

接下来,看一下 INFO ALL 命令的输出。 使用您的经验、敏锐的判断力和冷静的逻辑来回答这个问题——有什么看起来很奇怪吗? 🙂 当不跟踪持久存储网络复制瓶颈时,您应该专注于 statscommandstats 部分。

当 stats 部分中的 total_connections_received 的值高得离谱时,通常意味着您的应用程序正在为它发出的每个请求打开和关闭连接。 打开连接是一项昂贵的操作,会增加客户端和服务器的延迟。 要纠正此问题,请查阅您的 Redis 客户端的文档并将其配置为使用持久连接。

使用 commandstats 部分中的信息来精确定位占用您服务器最多资源的命令。 通过将命令替换为它们的变参对应项来寻找简单的解决方法。 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 数据库中获得更多收益而无需使用重型武器的一些方法。 即使采纳其中一个建议也可以产生巨大的差异并显着降低您的延迟。 了解更多交易技巧? 有任何问题或反馈? 请随时在Twitter 上@我,我随时待命 🙂