2

在类似推特的应用程序中,他们所做的一件事是当有人发布推文时,他们会遍历所有关注者并在他们的时间线中创建推文的副本。我需要类似的东西。假设我有一个关注者 ID 列表,那么将推文 ID 插入到 10/100/1000 个关注者中的最佳方法是什么。

我正在使用 Azure Redis 在 Azure WebJobs 中执行此操作。每个 webjob 都会为队列中收到的每条推文自动创建。所以我可能有大约 16 个同时运行的工作,每个工作都通过关注者并插入推文。我在想如果 99% 的插入发生,它们不应该因为一个或几个失败而停止。我需要继续但记录它。

问题:我应该像下面那样做 CreateBatch 吗?如果我需要先按时间倒序检索最新的推文是否可以?高性能?

var tasks = new List<Task>();
var batch = _cache.CreateBatch();
//loop start
tasks.Add(batch.ListRightPushAsync("follower_id", "tweet_id"));
//loop end
batch.Execute();

await Task.WhenAll(tasks.ToArray());

a) 但是如果出现故障,我该如何捕捉?试着抓?b)如何在每个列表中检查一个批次的总 # 并在达到某个 # 时弹出一个?如果列表> 800,我想做一个LeftPop。不知道如何在批处理中完成所有操作。

请给我一个示例或让我在这里有一个片段。苦苦寻找好方法。太感谢了。

更新 根据@marc 的评论,这看起来正确吗?

        var tasks = new List<Task>();
        followers.ForEach(f =>
        {
            var key = f.FollowerId;
            var task = _cache.ListRightPushAsync(key, value);
            task.ContinueWith(t =>
            {
                if (t.Result > 800) _cache.ListLeftPopAsync(key).Wait();
            });
            tasks.Add(task);
        });
        Task.WaitAll(tasks.ToArray());
4

1 回答 1

3
  1. CreateBatch 可能不会像您认为的那样做。它所做的是推迟一组操作并确保它们相对于单个连接连续发送 - 在某些情况下这很有用,但不是那么常见 - 如果是我,我可能会单独发送它们。还有CreateTransaction (MULTI/EXEC),但我认为这不是一个好的选择
  2. 这取决于您是否关心正在弹出的数据。如果不是:我会发送一个 LTRIM, [L|R]PUSH 对 - 在添加之前将列表修剪为 (max-1)。另一种选择是 Lua,但它似乎有点矫枉过正。如果您关心旧数据,则还需要进行范围查询。
于 2015-05-06T17:10:50.040 回答