当前位置: 首页 > 知识库问答 >
问题:

如何在redis stream中高效地使用XRange获取多条记录

廖弘量
2023-03-14

查看Redis流并在流上建立索引(就像EventStore一样),这非常有效,我可以在流中获得大量条目,但我找不到一种很好的方法来按id返回所有记录,例如像MGET。这是我看到的东西的简化版本。

        var records = await conn.StreamRangeAsync(indexStreamName, nextPosition, null, BatchSize);
        if (records.Any())
        {
             var results = new List<Event>();
             foreach (var record  in records)
             {
                  var msgs = await conn.StreamRangeAsync(record.Values.FirstOrDefault(x => x.Name == "stream").Value.ToString(), record.Values.FirstOrDefault(x => x.Name == "key").Value, null, 1);
                        results.Add(ToEvent(msgs.First()));
              }
              await playEvents(results.ToArray());
        }

显然,这是非常低效的,我想知道是否有一些方法可以在1个请求中从服务器获取此信息。

我还考虑过流构建其他流,但它会导致消息重复,我们的消息可能会变得很大。是的,我可以把所有的信息放在一个集合中,但是两个级别的间接寻址是一个太远的桥梁。

共有1个答案

潘弘博
2023-03-14

仍然希望得到更好的答案,但有一种方法可以做到这一点

就是说,父流中的消息和所有较小流的索引都不理想,因为较大流在逻辑上是一个聚合,而不是实际数据,但可以正常工作。

 类似资料: