简单地说,我们现在是Redis

了解更多

复述,最佳实践

带有位域的时间序列

如果你存储的是纯标准化的数值数据,那么Redis可以非常有效地将时间序列数据存储在位域中。为了存储数据,我们首先必须确定任意的历元时间、分辨率和数字格式。让我们以捕获温度数据为例。假设我们想每分钟测量一次温度我们把epoch设为一天的午夜。假设我们测量的是室内环境温度,单位是摄氏度。

据说我们可以像这样构建我们的数据:

  • 一天的第0分钟=第0字节
  • 温度记录在一个8位无符号整数(0到255)

这将产生大约1.44KB的一天数据

我们可以用BITFIELD命令记录温度:

>设置Bit-TS设置U8#0 221)(整数)0

在这种情况下,我们在一个无符号8位(u8)的关键位中记录了午夜(#0)的温度,温度为22。位域不局限于无符号8位值,事实上,您可以操作单个位到63位无符号或64位有符号。注意偏移量(#0)之前的散列,这意味着您希望它与指定的数据类型对齐。例如,如果指定#79,那就意味着输入79个字节——关闭哈希值意味着第79个字节

偏移量可以与从0开始存储的数字类型对齐。例如,如果我们想记录1 a.m.,考虑到零槽,我们会使用#59的偏移量,或者使用中午的偏移量#719。

> BITFIELD bits -ts SET u8 #59 23 SET u8 #719 251)(整数)02)(整数)0

这说明位域是variadic,你可以一次添加多个值。

让我们在我们的时间序列中添加更多的值:

> BITFIELD bits -ts SET u8 #60 21 SET u8 #61 201)(整数)02)(整数)0

现在,让我们检索这些值:

> Bitfield Bit-TS获取U8#59获取U8#60获取U8#611)(整数)232)(整数)213)(整数)20

BITFIELD的子命令GET的格式就像SET一样,只是它不接受一个值作为它的第三个参数。

如果我们知道需要获取的所有索引值,这很好,但有时我们需要一个范围的值,单独指定每个字节就太麻烦了。我们可以使用GETRANGE命令。通常,这用于从字符串中检索字节,但BITFIELDs只是处理相同底层数据的不同方式。

>getrange.bit-ts 59 61“x17x15x14”

这将返回十六进制格式的字节59到61(十进制格式的23、21和20)。语言客户端在处理二进制数据方面比redis-cli做得更好,通常可以检索语言的惯用字节数组。

在我们的示例中,我们操作了字节0、59-61和719。如果我们请求一个还没有设置的字节会发生什么?让我们来看看:

> BITFIELD bits -ts GET u8 #401)(整数)0>位菲尔德Bit-TS获得U8#7501)(整数)0> GETRANGE bitts 30 50“x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00”

我们可以看到,Redis将未分配的字节处理为十六进制00 /十进制0。在处理时间序列数据时,这可能会很棘手——应用程序逻辑需要在0和未设置的值之间做一些区分。这可能涉及到一些人为的地板和跳过值设置为0,特别是当使用有符号整数时,因为这可能是您范围中的一个合法值。

时间序列的实际存储长度实际上取决于最后一个字节集。因此,在我们的示例中,存储的最后一个字节是字节#719(基于零),因此数据有720字节长。我们可以用STRLEN确认:

>STRLENbit-ts(整数)720

基于bitfield的时间序列是一种强大而紧凑的存储数字或二进制数据的模式。然而,这个解决方案并不适合所有的用例,应该仔细评估它是否适合您的特定需求。

Baidu