简单地说,我们现在是Redis
在加入Redis之前,我曾在一家从事物联网(IoT)等技术的咨询公司工作。如果你不熟悉这个概念,物联网都是关于连接到互联网的智能设备。这些设备中有许多包括传感器,可以产生关于真实世界的度量。例如,一个值得注意的物联网应用案例是自行车共享公司,自行车本身连接到互联网,并不断通知其所有者其位置和其他条件。但也许物联网技术最大、最有前途的应用是在工厂,或工业物联网(IIoT).
而物联网为各种可能性打开了一扇窗,市场预测在几年内将超过1万亿美元416亿台物联网设备预计将产生79.4 zettabytes的数据在美国,实施基于物联网的服务,主要围绕大规模处理物联网数据,仍有挑战需要克服。
回到我的咨询经验,我记得与一家公司的数据科学团队会面,该公司的物联网解决方案存在问题。该团队面临的主要难题是如何将数据存储在基于NoSQL文档的数据库中。他们试图在两个数据模型中做出选择,其中一个优化查询速度,而另一个优化空间效率。
第一个模型包括每个文档存储一个数据点,像这样:
{" Id ":“1-2-3”,“时间”:123123123,经度:0.123,“纬度”:0.123,“电池”:0.66}
这种方法可以产生最快的查询速度,但缺点是它会占用大量存储空间。另一种模式旨在更有效地利用空间,看起来是这样的:
{“ChunkId”:“abc”,“ChunkStartTime”:123123123,“块”:[[“1-2-3”,123123123,0.123,0.123,0.66),(“4-5-6”,456456456,0.456,0.456,0.99),…]}
如您所见,第二个模型更加复杂:每个文档在单个块中保存多个数据点。这个模型需要更复杂的查询来解释块,但作为交换,它提供了一些空间节省。
当时我对这个问题没有一个好的解决方案,但现在我意识到,使用Redis Streams这个问题并不存在。
当你有一个时间导向的、本质上不可变的杂项数据流时,就像物联网数据通常的情况一样,Redis Streams可能是最初摄入的正确数据结构。
Redis Stream key包含一个索引表项。每个索引ID是一个毫秒级精确的时间戳,后面跟着一个序列号,用于在同一毫秒内发生的事件。每个条目都是一个字段-值对序列,几乎与Redis Hash相同。“几乎”,因为Redis哈希是一种很好的方式来可视化你可以放入流除了一个小的区别:一个Redis流条目可以有多个相同字段的实例,而字段在Redis哈希是唯一的。
下面的命令显示了如何添加一个条目到Redis流。看看的文档要学习更多的知识。
> XADD mystream *时间123123123 lon 0.123 lat 0.123 battery 0.66
Redis Streams使用根树压缩索引id并允许对条目进行固定时间访问的数据结构。
Redis Streams还采用了另一种适用于字段名的智能空间节省机制。
您可能不经常考虑这个问题,但是为输入字段选择的名称会影响每个条目占用多少空间。对于SQL数据库,这个问题不会出现,因为模式在表级是固定的,但缺点是失去了灵活性。使用NoSQL,基于文档的数据库可以获得更大的灵活性,但文档需要一次又一次地保存表示字段名的字符串。
在Redis Streams中,流中的每个条目都可以有不同的字段集,所以你可以有尽可能多的灵活性,但如果你保持字段集的稳定,Redis将不会存储它们名称的多个副本。根据您拥有的字段数量,使用该特性可以避免大量开销。
举个简单的例子,假设您有100万个条目,每个条目有20个字段,字段名的平均长度为15个字节。这相当于每百万项可以避免300兆字节的开销。
虽然Redis Streams非常适合物联网用例,但它们并不仅限于物联网。相反,在Redis中有更多的数据结构可以帮助你节省空间,当你大规模地吸收数据时,包括概率数据结构为例。
当你掌握了Redis Streams,考虑使用RedisTimeSeries模块,用于存储从接收的原始数据派生的数字时间序列数据。如果你想了解更多关于Redis Streams和RedisTime系列,报名参加我们的训练日RedisConf20.20.外卖发生在线5月12 - 13日。