如何将一批记录插入Redis



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

我正在使用Azure Redis在Azure Webjobs中进行此操作。每个WebJob都是为队列中收到的每个推文自动创建的。因此,我可能会在每个人经过追随者并插入推文的同时约有16个同时运行。我需要继续记录。

问题:我应该像以下那样的创建键吗?如果我需要首先以相反的时间顺序检索最新推文,那么良好?表演?

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,我想做一个左POP。不确定如何在批处理内部完成。

请把我指向样本,或者让我在这里有一个片段。努力寻找一种好方法。非常感谢。

更新这看起来是根据 @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可能不会做您认为的事情。它的作用是 defer 一组操作,并确保它们相对于单个连接的连续发送 - 在某些情况下,这很有用,但不 all all at the common -i如果是我,可能只是单独发送他们。也是createTransaction(Multi/exec),但我认为这不是一个不错的选择。
  2. 取决于您是否关心要弹出的数据。如果不是:我会发送ltrim,[l | r]推对 - 在添加之前,将列表修剪为(max -1)。另一个选择是LUA,但似乎过于杀伤。如果您关心旧数据,则需要进行范围查询。

最新更新