如何将一批记录插入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());
- CreateBatch 可能并不像您想象的那样。它所做的是 延迟 一组操作并确保它们相对于单个连接连续发送 - 在某些情况下这很有用,但不是 all 很常见 - 如果是我,我可能会单独发送它们。还有 还有 CreateTransaction (MULTI/EXEC),但我认为这不是一个好的选择。
- 这取决于您是否关心弹出的数据。如果不是:我会发送一个 LTRIM,[L|R]PUSH 对 - 在添加之前将列表 trim 发送到 (max-1)。另一种选择是 Lua,但它似乎有点矫枉过正。如果您关心旧数据,您也需要进行范围查询。
在类似 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());
- CreateBatch 可能并不像您想象的那样。它所做的是 延迟 一组操作并确保它们相对于单个连接连续发送 - 在某些情况下这很有用,但不是 all 很常见 - 如果是我,我可能会单独发送它们。还有 还有 CreateTransaction (MULTI/EXEC),但我认为这不是一个好的选择。
- 这取决于您是否关心弹出的数据。如果不是:我会发送一个 LTRIM,[L|R]PUSH 对 - 在添加之前将列表 trim 发送到 (max-1)。另一种选择是 Lua,但它似乎有点矫枉过正。如果您关心旧数据,您也需要进行范围查询。