之前介绍的都是Redis的基础知识,本节我们来换换口味,处理一种实际的业务场景。在物联网中,往往需要及时记录与时间相关的数据,例如化工厂中可能需要实时记录当前时间的温度、压力、流量等物性参数,同时希望对这些参数能够进行排序的操作,那么这些功能该如何实现呢?
基于Hash和Sort Set实现
第一种实现方式需要两种数据结构,为什么?首先我们可以通过Hash实现高效的时间查询,但是他存在显著的缺点——不支持范围查询,并且Hash存储的数据是乱序的,所以没法获得有序的时间相关的数据,所以引入了Sort Set这种数据结构,这样既支持了等值查询,也满足范围查询和有序查询。但是这种方式又面临一个新的问题?两种数据结构怎么保证数据一致?为了保证操作的原子性,类似关系型数据库中的事务来实现,Redis提供了两种指令MULTI表示开启事务,EXECT表示结束事务,只要在这两个命令之间执行操作就可以保证数据的一致性。但是这个方法还存在一个弊端:有些业务场景中需要进行聚合操作,但是这种方式不能再Redis中进行聚合操作,只能够将数据发送给客户端以后,在客户端进行聚合计算返回结果,这种方式就会导致传输数据过程中带宽被严重占用。下面介绍的第二种方式就能够解决上述问题!
基于RedisTimeSeries实现
基于RedisTimeSeries实现实现可以在上面功能的基础上,能够在Redis实例的基础上完成聚合计算。当用于时间序列数据存取时,RedisTimeSeries 的操作主要有 5 个:
- 用 TS.CREATE 命令创建时间序列数据集合;
- 用 TS.ADD 命令插入数据;
- 用 TS.GET 命令读取最新数据;
- 用 TS.MGET 命令按标签过滤查询数据集合;
- 用 TS.RANGE 支持聚合计算的范围查询。
但是RedisTimeSeries也是存在弊端的,RedisTimeSeries底层是链表实现的,所以在时间复杂度上为O(N),并且只能够得到最新的数据,并不能像Hash获取到任意时间的数据。
所以以上两种实现各有利弊,大家可以根据使用的常见选择。