高并发下时间序列数据存储场景

特点:1.连续记录数万条设备的实时状态 2.只写入不更改 3.单个记录查询、范围查询、聚合操作。

方案一:基于 Hash,key 为时间戳,value 为状态值。但不支持范围查询。
方案二:基于 Sorted Set,value 记录时间戳和状态值。
前者进行单个时间点查找,后者进行时间范围查找。
而为了保证数据能同时写入 Hash 和 Sorted Set 中,操作的原子化,使用 Redis 的简单事务机制 —— MULTI(事务开始) 和 EXEC(事务结束) 指令。

而如果进行聚合操作,需要 Redis 扩展模块 RedisTimeSeries,专门用来处理时间序列的运算,支持聚合计算、按标签属性过滤查询结果,但范围查询是 O(n)的。

使用 Sorted Set 的来存储实时状态的弊端:用时间戳作为 score,用状态值作为 member,那么当状态值重复时,会进行去重,只留下最新时间戳。 —— 状态值+时间戳作为 member?
是否将聚合操作当作 Redis Sorted Sort 的功能?不太现实,聚合操作耗费 CPU 时间较多。

Related:<Redis核心技术与实战> —— 14 如何在Redis中保存时间序列数据?