简单地说,我们现在是Redis
(注:这篇博客文章改编自我在6月举办的一次网络研讨会。为了更深入地了解RedisTimeSeries,现在注册并观看网络研讨会!)
大多数开发ag万博下载万博最新版本下载苹果人员都知道Redis的实时响应功能非常适合处理时间序列数据。但到底是什么是时间序列数据?大量的定义延伸到一页又一页的解释,但我认为它可以被极大地简化:
基本上,时间序列数据是将时间编码为索引的数据,其中每个记录的时间都有一个数值。如果将其可视化为两列,其中一列将具有某种时间索引,通常是Unix epoch形式的时间戳。而另一列会有一些数值。
非常简单。
更重要的是,您可以使用时间限制来分析时间序列数据,例如,查看1月1日至1月3日之间发生的事情。你也可以用秒,甚至毫秒来描述。您还可以将数据划分为时间单位,以查看每小时发生的情况。然后,如果您不想查看时间序列数据中的每一个事件,您可以在此基础上添加一个聚合,例如获得每小时的平均值。
很多人一想到时间序列数据就会想到股票图表。这是观察股票在特定时期内表现的好方法。我经常查看的一个时间序列数据用例是服务器在任何指定间隔期间的CPU负载。时间序列数据也是查看传感器数据和其他物联网(IoT)信息的好方法。任何时候你在观察一段时间内的趋势,通常都来自于某种时间序列数据库或时间序列结构。
现在让我们关注Redis和时间序列。这一切都始于排序集,Redis的内置数据结构之一。人们很早就开始使用排序集来处理时间序列数据,看起来像这样:
> ZADD mySortedSet 1559938522 1000
这个例子包括ZADD命令,mySortedSets作为键,一个时间戳,作为分数。最后是成员,也就是值。
这很好,但你只能得到范围,你不能取平均值或下采样。
集合不能有重复。在这里,如果您有两个具有相同值的不同时间戳,则集合基于成员(在本例中,我们将定义为值)。在下面的例子中,第二个函数实际上是向上的——它会覆盖第一个函数。这对时间序列数据不起作用,当人们这样使用它时,就会有一些粗鲁的醒悟:
> ZADD mySortedSet 1559938522 1000
> ZADD mySortedSet 1559938534 1000
ag万博下载万博最新版本下载苹果开发人员提出了许多计算复杂且很难实现的解决方案。肯定有更简单的办法。
然后,大约两年前,复述,4.0Redis Streams首次亮相,旨在解决使用统一日志架构和进程间消息传递构建应用程序的问题。
对于时间序列用例来说,Redis Streams提供了比排序集更重要的优势。它允许自动生成id、没有重复和每个示例字段/值对。
> XADD myStream * myValue 1000
> XADD myStream * myValue 1000另一个字段hello
正如您在第一个命令中看到的,我们设置了这个字段myField来1000.在第二个命令中创建了一个新条目括号设置为1000以及anotherField设置为你好.这些都是位于键的流中的条目myStream.
但它仍然缺乏重要的功能,并不是为时间序列数据设计的。您可以很容易地获得时间范围,但其他的就不多了。
现在让我们回过头来谈谈Redis模块API,它在Streams之前出现,允许Redis拥有额外的社区和数据类型。Redis用户可以在Redis内部构建作为一流公民的模块。现有的模块包括从RediSearch来RedisGraph来RedisJSON.现在有RedisTimeSeries,这基本上在Redis内部创建了一个完整的时间序列数据库。
在我们讲如何使用RedisTimeSeries模块,重要的是要了解引擎盖下发生了什么。
你需要了解的第一件事是“大块”。实际上,你永远不会直接操作一个数据块,但RedisTimeSeries将所有数据存储在这些数据块中。每个块由双链表中的两个相关数组(一个用于时间戳,一个用于样例值)组成。
例如,假设我想在时间序列数据库中放入一个时间戳。它在两个数组的第一行。如果你有额外的样本,它们就会进入数组。
块大小是固定的。当数据块满时,额外的数据会自动转移到下一个数据块。添加到链表的开头或结尾在计算上是很简单的,所以当添加新块时,它是非常轻量级的。
但与大多数Redis数据类型不同的是,最好的做法是首先创建时间序列键。在这种情况下,我的命令是TS.CREATE.然后我有迈伊兹集团,这就是我在这里使用的关键。
假设我们想要在这个键中添加一些元数据。假设我们在经营一个蔬菜苗圃我们想在4号温室里追踪47号卷心菜;我们称之为元数据标签。这将适用于整个时间序列中的每一个样本:
处理时间序列数据的另一个重要部分是保留。假设我们不关心任何超过60秒的东西。RedisTimeSeries可以删除您指定的保留时间周期之外的内容。
我们可以使用一个叫做TS.ADD.第一个参数是关键迈伊兹集团星号是从Redis Streams借来的语法,表示Redis将自动生成时间戳。本例中为834。
让我们添加另一个示例,并指定时间戳。注意,时间戳实际上是只能追加的,因此不能在最近使用的时间戳之后添加内容。随后的TS.ADD时间戳必须大于这个值。
接下来,要获得有界结果,您需要查询两个时间戳之间的所有样本。使用我们的示例,您可以看到第一个时间戳的值为834,第二个时间戳的值为1000。
这很有用,但你可能想要每30秒的平均值。在这里,avgIs是我们的关键词,而917,当然,是834和1000的平均值。
但是当你有更多的数据时会发生什么呢?你可能不想运行它TS.RANGE命令,只是想粒度提取数据。
我们有能力制定规则!迈伊兹集团是我的关键:那是源头。目的地是myTS2这是第二个关键。这里的所有块表示30秒的时间,RedisTimeSeries将自动将其放入目标key的辅助键中。所以每过30秒,就会有一个样本加入myTS2.
但是等等,还有更多!这不仅仅局限于平均水平。你可以求和,你可以得到最小值,最大值,你可以得到一个范围。你可以得到计数-多少-第一个或最后一个。所有这些不同的聚合函数也适用于TS系列.
让我们看看RedisTimeSeries还能做什么。的命令TS.INCRBY和TS.DECRBY是用来随时间计数的。TS.INCRBY将前一项增加某个值。假设您知道在10秒内收集了10个小部件。你会跑TS.INCRBY一个关键。这样你就不需要知道之前的值,你可以保持一个连续的计数。这同样适用于TS.DECRBY,只是反过来。
TS.GET与此同时,它攫取了最后的价值。和TS.ALTER允许您更改已创建的键的元数据,包括字段、值保留等。
TS.MRANGE和TS.MGET很有趣,但解释起来有点复杂。RedisTimeSeries跟踪数据库中所有不同的时间序列键。TS.MRANGE允许指定标签的键/值对。在我们的温室例子中,你可以得到4号温室的温度读数,然后使用TS.MRANGE查看整个键空间中的不同键。同样的,TS.MGET让您通过标签获得单个最近的值。您可以将RedisTimeSeries与基础设施的不同部分(如Prometheus和Grafana)连接起来,这是一种很好的监视仪表板的方法。
即使我们发现我们的客户在越来越多的用例中使用时间序列数据,许多公司仍然在关系数据库中存储他们的时间序列类型。从技术的角度来看,这并不是一个很好的选择。当只有两三个人在查看仪表板时,它可能会工作得很好,但当您希望整个组织的数千人都在查看相同的分析仪表板时,关系数据库的临时查询往往跟不上。
这就是为什么我们看到RedisTimeSeries被用来缓存时间序列数据,否则会在一个较慢的数据库中使用,也得到其他Redis的好处,包括选择是否持久您的数据或保持它短暂。