【发布时间】:2018-11-21 05:07:19
【问题描述】:
我正在对数据流执行一些分析并将结果发布到 Redis 通道上。消费者订阅这些频道并获得实时数据馈送。历史数据分析结果全部丢失。
现在我想在 Redis 中添加存储历史数据的功能,以便消费者可以查询这些历史数据(主要是按时间)。由于分析结果是按时间划分的,将结果存储在 Redis 中的好的设计是什么?
【问题讨论】:
-
请注意,redis 获取密钥的性能会随着您获取的单个密钥的数量线性下降。因此,如果您存储了(大部分)连续数据的大型列表,则获取数据时间序列的单字符串表示需要 N 倍的时间。 (对于 300 个值来说这不是问题......但对于 100k 个值来说增加了几个数量级的延迟)。
-
@Nisan - 我不认为我完全理解。如果我每 30 秒存储一次日期,该方法(使用下面的 zsets)是否会产生这种性能损失。
-
尝试填充您期望的大小的列表并测量读取它需要多长时间。现在尝试将整个列表保存为字符串(例如,作为序列化 JSON 对象,尽管肯定有更多压缩/性能选项)。以我的经验,对于同质数据类型(例如最多 K 位的整数)的非常大的列表(例如 50k-500k 元素),将整个列表存储为时间序列的字符串表示并解包大约快 1000 倍从 Redis 读取后。
-
@SoumyaSimanta 排序集是
O(log(N)+M),并且不受列表的相同时间复杂度的影响;它们的效率要高得多。 @Nisan.H 我不同意您的建议,将整个列表存储为字符串可能适用于小列表,但不能扩展到非常大的列表,因为它会强制客户端在执行任何操作之前检索整个列表并解压缩它在上面;这不是一个有效的解决方案。下面概述的排序集的使用是 OP 问题的教科书解决方案。 -
@Raffian 虽然我原则上同意,但根据我的经验,Redis 从集合(列表、集合、排序集、哈希字段)中读取 N 个值与读取 N 个常规值一样长键:值对。读取单个非常大的值并不需要很长时间......这是非常具体的情况,只有当您的集合非常大并且您的读取量很大(每个读取操作有数千个值)时才会出现问题,但这是值得的意识到。
标签: database-design redis