我们现在就是Redis

了解更多

Redis最佳实践

字典排序集时间序列

处理时间序列的另一种方法是使用排序集的字典属性来存储时间戳和值词典编码现在正是时候。

实际上,在这种方法中,我们以相同的分数(通常为0)存储所有内容,并首先将时间戳编码,然后将值编码为成员。例如:

>ZADD莱克斯温度0 1511533205001:21(整数)1>ZADD莱克斯温度0 1511533206001:22(整数)1>ZADD莱克斯温度0 1511533207001:21(整数)1>ZRANGE莱克斯温度0 -1 1)“1511533205001:21”2)“1511533206001:22”3)“1511533207001:21”

(一如既往,您可以用更高的基数表示时间戳,以节省几个字节)

在三个ZADD命令中,时间戳与值之间用冒号分隔,我们可以看到每个命令返回一个1,表示这三个值都被添加了。在最后一个命令ZRANGE中,我们看到顺序被保留。为什么?在排序集中,当分数相等时,具有相同分数的结果通过二进制排序进行排序。因为ou中的时间戳r当前时间段都有相同数量的数字,所有内容都将被很好地排序(如果时间戳在2002年之前或2285年之后,则需要添加填充数字)。

虽然这并不依赖于添加唯一性来防止重复,但它有一个不同的缺点:在同一毫秒内有相同值的多个项目不会被记录。对于您的用例来说,这可能是一个问题,也可能不是,在实践中,毫秒分辨率证明对于大多数情况已经足够了。

要从这种类型的时间序列模型中获取一系列值,您将使用ZRANGEBYLEX命令。假设我们想要获得时间戳1511533200001之后的温度:

>ZRANGEBYLEX lex温度(151153320001+1)“1511533205001:21”2)“1511533206001:22”3)“1511533207001:21”

第二个参数的前缀是一个开括号,表示它不包含实际值(inclusive用一个开方括号表示)。实际上,上述格式使inclusive和exclusive不相关,因为时间戳后面总是跟有其他数据。第三个参数(+)表示我们不需要上限。

让我们看一个反直觉的问题。以下面的代码为例,我们尝试获取1511533200001和1511533207001之间的数据,包括:

>ZRANGEBYLEX lex温度[151153320001[1511533207001 1)“1511533205001:21”2)“1511533206001:22”

为什么时间戳1511533207001的数据被排除在外,尽管添加了包含前缀?人们很容易认为Redis不知何故理解这是一个时间戳,但事实是Redis对此很幼稚,Redis只看到二进制排序。在二进制排序中,“1511533207001:21”大于“1511533207001”包含或独占。在上限上包含的正确方法是从所需上限向上移动一毫秒,并使用独占表示法:

>ZRANGEBYLEX lex温度[151153320001(1511533207002 1)“1511533205001:21”2)“1511533206001:22”3)“1511533207001:21”

字典排序集时间序列具有与普通排序集时间序列数据类似的一组有用命令:

锌店ZUNIONSTORE可用于字典排序集,但有丢失数据点的风险,因为重复的时间戳和值组合不会在数据中重复。

您可能想知道为什么选择带有时间戳分数的排序集而不是字典排序集编码。通常情况下,除非您的值总是如果时间戳分数是唯一的,那么时间戳分数将更有效。

Baidu