我目前正在将以下格式 (JSON) 的数据存储在 Redis ZSET 中。分数是以毫秒为单位的时间戳。
<timestamp_1> - [ { "key1" : 200 }, { "key2": 100 }, {"key3" : 5 }, .... {"key_n" : 1} ]
<timestamp_2> - [ { "key50" : 500 }, { "key2": 300 }, {"key3" : 290 }, ....{"key_m" : 26} ]
....
....
<timestamp_k> - [ { "key1" : 100 }, { "key2": 200 }, {"key3" : 50 }, ....{"key_p" : 150} ]
我想提取给定时间范围内某个键的值。
例如,上面示例中的 key2 的值将在整个时间范围内。
[timestamp_1:100, timestamp_2:300, ..... timestamp_k:200]
我可以获得当前输出,但我必须为每一行解析 JSON,然后遍历它以获取每一行中给定键的值。随着每行大小的增加(n、m 和 p 可以大到 10000),解析成为瓶颈。
我正在寻找有关是否有提高 Redis 性能的方法的建议?是否有任何特定的解析器(在 Scala 中)可以在这里提供帮助。
如果 Cassandra 和 Elasticsearch 等性能更好,我也愿意使用其他存储。除了 JSON 之外,我还接受其他格式来将数据存储在 Redis ZSet 中。
最佳答案
Cassandra 可以很好地满足您的要求。
你可以保留key_id
作为分区键和 timestamp
作为行键。
在 cassandra 中设计列族之前,您总是先定义查询。 提取给定时间范围内键的值。
如果您使用的是 CQL3,
创建模式:
CREATE TABLE imp_keys (key_id text, score int, timestamp timeuuid,PRIMARY KEY(key_id,timestamp));
访问数据:
SELECT score FROM imp_keys WHERE key_id=key2 AND timestamp > maxTimeuuid(start_date) AND timestamp < maxTimeuuid(end_date);
关于json - 提高聚合跨多个 JSON 行的键值的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25439129/