t-digest

t-digest 是一种概率性数据结构,允许您估计数据流的百分位数。

t-digest 是一种 Redis Stack 中的草图数据结构,用于使用紧凑草图从数据流或大型数据集中估计百分位数。

它可以回答诸如以下问题:

  • 数据流中哪些比例的值小于给定值?
  • 数据流中多少个值小于给定值?
  • 数据流中小于 *p* 百分比的值的最高值是多少?(p 百分位数是多少)?

什么是 t-digest?

t-digest 是一种数据结构,它将估计百分位点,而无需存储和排序集合中的所有数据点。例如:要回答问题“99% 的数据库操作的平均延迟是多少”,我们需要存储每个用户的平均延迟,对值进行排序,剔除最后 1%,然后才能找到所有剩余值的平均值。这种过程不仅在对这些值进行排序所需的处理方面成本高昂,而且在存储这些值所需的存储空间方面也成本高昂。这正是 t-digest 解决的问题。

t-digest 还可以用于估计与百分位数相关的其他值,如截断均值。

**截断均值** 是从草图中获得的均值,不包括低于和高于截止百分位数的观测值。例如,0.1 截断均值是草图的均值,不包括最低 10% 和最高 10% 的值。

用例

硬件/软件监控

您测量在线服务器响应延迟,并且想要查询

  • 测量到的延迟的第 50、90 和 99 百分位数是多少?

  • 测量到的延迟中,有多少比例小于 25 毫秒?

  • 忽略异常值后的平均延迟是多少?或者第 10 百分位数和第 90 百分位数之间的平均延迟是多少?

在线游戏

数百万人在您的在线游戏平台上玩游戏,您想向每个玩家提供以下信息?

  • 您的分数比 X% 的游戏会话得分高。

  • 有大约 Y 个游戏会话中,玩家的分数比您高。

  • 要获得比 90% 的游戏会话得分更高的分数,您的分数应为 Z。

网络流量监控

您测量每秒通过网络传输的 IP 数据包,并尝试通过以下方式检测拒绝服务攻击:

  • 最后一秒中的数据包数量是否超过之前观察值的 99%?

  • 正常网络条件下,我预计会看到多少个数据包?(答案:介于 X 和 Y 之间,其中 X 表示第 1 百分位数,Y 表示第 99 百分位数)。

预测性维护

  • 测量的参数(噪声水平、电流消耗等)是否异常?(不在 [第 1 百分位数...第 99 百分位数] 范围内)?

  • 我应该将警报设置为哪些值?

示例

在以下示例中,您将创建一个压缩率为 100 的 t-digest 并向其添加项目。COMPRESSION 参数用于指定准确性和内存消耗之间的权衡。默认值为 100。更高的值意味着更高的准确性。注意:与其他一些概率数据结构不同,TDIGEST.ADD 命令如果键不存在,则不会创建新的结构。

每当有新的观察结果可用时,您可以重复调用 TDIGEST.ADD

通过值估计分数或排名

t-digest 中另一个有用的功能是 CDF(排名的定义),它告诉我们小于或等于某个值的观测值的分数。此命令对于回答诸如“小于或等于 X 的值的观测值的百分比是多少”之类的问题非常有用。

更准确地说,TDIGEST.CDF 将返回草图中小于 X 的观测值的估计分数加上等于 X 的观测值数量的一半。我们还可以使用 TDIGEST.RANK 命令,它非常相似。它不返回分数,而是返回值的 ----估计---- 排名。 TDIGEST.RANK 命令也是可变参数的,这意味着您可以使用单个命令来检索一个或多个值的估计值。

以下是一个示例。给定一组自行车运动员的年龄,您可以问一个问题,例如“小于 50 岁的自行车运动员的百分比是多少?”

最后,TDIGEST.REVRANK key value...TDIGEST.RANK 相似,但它为每个输入值返回(大于给定值的观测值 + 等于给定值的观测值数量的一半)的估计值。

通过分数或排名估计值

TDIGEST.QUANTILE key fraction... 为每个输入分数返回小于给定分数的观测值的估计值(浮点数)。 TDIGEST.BYRANK key rank... 为每个输入排名返回具有该排名的估计值(浮点数)。

TDIGEST.BYREVRANK key rank... 为每个输入 **反向排名** 返回具有该反向排名的 **值**(浮点数)。

估计修剪后的平均值

使用 TDIGEST.TRIMMED_MEAN key lowFraction highFraction 来检索指定分数之间的平均值的估计值。

这对于计算忽略异常值的平均值特别有用。例如,计算第 20 百分位数和第 80 百分位数之间的平均值。

合并草图

有时合并草图很有用。例如,假设我们测量 3 台服务器的延迟,并且我们希望计算所有服务器的组合的 90%、95% 和 99% 延迟。

TDIGEST.MERGE destKey numKeys sourceKey... [COMPRESSION compression] [OVERRIDE] 将多个草图合并为单个草图。

如果 destKey 不存在,则创建一个新的草图。

如果 destKey 是一个现有的草图,则其值将与源键的值合并。要覆盖目标键的内容,请使用 OVERRIDE

检索草图信息

使用 TDIGEST.MINTDIGEST.MAX 分别检索草图中的最小值和最大值。

草图为空时,两者都返回 nan

这两个命令都返回准确的结果,等效于 TDIGEST.BYRANK racer_ages 0TDIGEST.BYREVRANK racer_ages 0

使用 TDIGEST.INFO racer_ages 来检索有关草图的一些其他信息。

重置草图

学术来源

参考文献

RATE THIS PAGE
Back to top ↑