如何将一批记录插入Redis

时间:2015-05-05 16:44:47

标签: stackexchange.redis azure-redis-cache

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

我使用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)如何在一个批处理中检查每个列表中的总数#,如果达到某个#,则弹出一个#?如果列表是&gt;我想做一个LeftPop 800.不确定如何在批次内完成所有操作。

请指点示例或让我在这里有一个片段。苦苦寻找好方法。非常感谢你。

更新 根据@ 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 个答案:

答案 0 :(得分:2)

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