如何将一批记录插入Redis

How to insert a batch of records into Redis

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

我正在使用 Azure Redis 在 Azure WebJobs 中执行此操作。每个网络作业都会为队列中收到的每条推文自动创建。所以我可能同时有大约 16 个作业 运行,每个作业都经过追随者和插入 tweets.I 我在想如果 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());
  1. CreateBatch 可能并不像您想象的那样。它所做的是 延迟 一组操作并确保它们相对于单个连接连续发送 - 在某些情况下这很有用,但不是 all 很常见 - 如果是我,我可能会单独发送它们。还有 还有 CreateTransaction (MULTI/EXEC),但我认为这不是一个好的选择。
  2. 这取决于您是否关心弹出的数据。如果不是:我会发送一个 LTRIM,[L|R]PUSH 对 - 在添加之前将列表 trim 发送到 (max-1)。另一种选择是 Lua,但它似乎有点矫枉过正。如果您关心旧数据,您也需要进行范围查询。