在类似 Twitter 的应用程序中,他们所做的一件事是当有人发布推文时,他们会迭代所有关注者并在时间轴中创建该推文的副本。我需要类似的东西。假设我有一个关注者 ID 列表,将推文 ID 插入到 10/100/1000 个关注者中的最佳方法是什么。
我正在使用 Azure Redis 在 Azure WebJobs 中执行此操作。每个网络作业都会为队列中收到的每条推文自动创建。因此,我可能同时运行大约 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());
最佳答案
- CreateBatch 可能不会做您认为它会做的事情。它的作用是推迟一组操作并确保它们相对于单个连接连续发送 - 在某些情况下这很有用,但不是全部那么常见 - 我如果是我的话,可能会单独发送它们。还有 CreateTransaction (MULTI/EXEC),但我认为这不是一个好的选择。
- 这取决于您是否关心所弹出的数据。如果不是:我会发送一个 LTRIM、[L|R]PUSH 对 - 在添加之前将列表修剪到 (max-1)。另一种选择是 Lua,但它似乎有点过分了。如果您关心旧数据,则还需要进行范围查询。
关于stackexchange.redis - 如何向Redis中插入一批记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30058757/