stackexchange.redis - 如何向Redis中插入一批记录

标签 stackexchange.redis azure-redis-cache

在类似 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());

最佳答案

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

关于stackexchange.redis - 如何向Redis中插入一批记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30058757/

相关文章:

c# - ASP.NET HttpSession.Abandon 不关闭 redis 连接

redis - Azure Redis 缓存 - 在选择 MaxMemory-Reserved 和 MaxMemory-Policy 时需要帮助

caching - Redis 缓存 - "Server Closed the connection"错误

redis - Azure Redis 缓存未正确过期

asp.net - 为什么 asp.net 上的 Azure Redis 缓存仅使用 1000 个连接的客户端并抛出超时错误?

c# - 从 Redis 获取复杂对象时,值为空

asp.net-core - 有没有办法更新 Redis 中的值?

lua - 使用 stackexchange.redis 存储 Lua 脚本

redis - AppFabric 缓存到 Redis - 等效于 GetAndLock 方法?

StackExchange.Redis server.Keys(pattern :"IsVerySlow*")