Redis 慢日志是用于调试和追踪 Redis 数据库的最佳工具之一,特别是在使用 Redis 操作时遇到高延迟和高 CPU 使用率的情况下。此在线讨论位于一个 Redis DB 群组中,仅仅是展示 Redis 慢日志效率的众多示例之一。由于 Redis 基于单线程架构,因此 Redis 慢日志比 MySQL 慢查询日志等多线程数据库系统的慢日志机制更加有用。
与产生软件锁定开销的工具不同(软件锁定开销会使调试过程变得非常复杂),Redis 慢日志可以非常高效地显示每个慢速命令的实际处理时间。作为 Redis Cloud 的提供商,我们广泛使用了 Redis 慢日志用于内部监管,并且帮助用户解决与复杂查询相关的延迟问题。我们经常发现很难理解慢日志中显示的同一 Redis 命令的两个执行时间之间的差异,通常是由于诸如 ZUNIONSTORE、ZINTERSTORE、ZRANGEBYSCORE 等的复杂命令。根据我们的经验,我们认为 Redis 社区可以从为慢日志中存储的每个命令添加时间复杂性参数中受益。通过此增强功能,我们希望用户能够更全面地了解 Redis DB 操作,包括同一命令的执行时间之间的差异和 CPU 使用率激增。因此,不用再多费口舌,以下即是我们为 Enhanced Redis 慢日志做出的贡献(以粗体显示)
33) 1)(整数)468359
2)(整数)1358158701 3)(整数)132912 4) 复杂性信息:N:48362,M:38687 5)1) “ZUNIONSTORE” 2) “AAA” 3) “5” 4) “BBB” 5) “CCC” 6) “DDD” 7) “EEE” 8) “FFF” 9) “WEIGHTS” 10) “1” 11) “1” 12) “1” 13) “1” 14) “1” 15) “AGGREGATE” 16) “MIN” 34) 1)(整数)61701 2)(整数)1354754379 3)(整数)15217 4) 复杂性信息:N:886,M:885 5) 1) “ZREVRANGE” 2) “XYZ” 3) ”1” 4) ”1000” 5) “WITHSCORES” 35) 1)(整数)61700 2)(整数)1354754379 3)(整数)16067 4) 复杂性信息:N:897,K:2,M:897 5) 1) “ZINTERSTORE” 2) “XYZ” 3) ”2” 4) ”YZX” 5) “ZXY” |
要更加全面地了解其复杂性,您需要用到下表
命令 | 关注值 | 复杂性 |
LINSERT | N – 列表长度 | O(N) |
LREM | N – 列表长度 | O(N) |
LTRIM | N – 已删除元素的数量 | O(N) |
PUBLISH | N – 频道订阅者的数量M – 订阅模式的数量 | O(N+M) |
PSUBSCRIBE | N – 客户端订阅的模式的数量argc – 传递给命令的参数的数量 | O(argc*N) |
PUNSUBSCRIBE | N – 客户端订阅的模式的数量M – 订阅模式的总数argc – 传递给命令的参数的数量 | O(argc*(N+M)) |
SDIFF | N – 所有集合中元素的总数 | O(N) |
SDIFFSTORE | N – 所有集合中元素的总数 | O(N) |
SINTER | N – 最小集合中的元素的数量argc – 传递给命令的参数的数量 | O(argc*N) |
SINTERSTORE | N – 最小集合中的元素的数量argc – 传递给命令的参数的数量 | O(argc*N) |
SMEMBERS | N – 集合中的元素的数量 | O(N) |
SORT | N – 列表/集合/zset中的元素的数量M – 结果中的元素的数量 | O(N+M*log(M))O(N) (不排序) |
SUNION | N – 所有集合中元素的总数 | O(N) |
SUNIONSTORE | N – 所有集合中元素的总数 | O(N) |
UNSUBSCRIBE | N – 订阅所有频道的客户端的总数 | O(N) |
ZADD | N – zset中的元素的数量 | O(log(N)) |
ZCOUNT | N – zset中的元素的数量M – 最小值和最大值之间的元素数量 | O(log(N)+M) |
ZINCRBY | N – zset中的元素的数量 | O(log(N)) |
ZINTERSTORE | N – 最小 zset 中元素的数量K – zset 的数量M – 结果集中元素的数量 | O(N*K)+O(M*log(M)) |
ZRANGE | N – zset 中元素的数量M – 结果数量 | O(log(N)+M) |
ZRANGEBYSCORE | N – zset 中元素的数量M – 结果数量 | O(log(N)+M) |
ZRANK | N – zset中的元素的数量 | O(log(N)) |
ZREM | N – zset 中元素的数量argc – 传递给命令的参数的数量 | O(argc*log(N)) |
ZREMRANGEBYRANK | N – zset 中元素的数量M – 已删除元素的数量 | O(log(N)+M) |
ZREMRANGEBYSCORE | N – zset 中元素的数量M – 已删除元素的数量 | O(log(N)+M) |
ZREVRANGE | N – zset 中元素的数量M – 结果数量 | O(log(N)+M) |
ZREVRANK | N – zset中的元素的数量 | O(log(N)) |
ZUNIONSTORE | N – 所有 zset 中元素数量汇总M – 结果的元素数量 | O(N)+O(M*log(M)) |
对于那些关注此事的朋友们,这项扩展是 2.6 版 Redis 增强功能的一部分,您可以在我们的 GitHub 帐户中找到它。