使用 Golang 的 Redis 包执行 HSET 操作时超出了上下文截止时间

context deadline exceeded performing hset operation using golang's redis package

提问人:baris 提问时间:3/14/2023 更新时间:3/14/2023 访问量:933

问:

触发 的代码如下:HashMapSet


    ctx = context.WithValue(ctx, "isCli", true)
    numberOfCreatedGroups := 0
    for _, ip := range ips {
        time.Sleep(time.Millisecond * time.Duration(delay))
        if err := ih.dc.add(ctx, ip, uint32(0)); err != nil {
            log.WithFields(log.Fields{
                GroupIp: ip,
            }).Info(err)
            continue
        } else {
            numberOfCreatedGroups += 1
        }
    }

该函数还调用以下函数:add

_, err := db.Repo.HashMapSet(ctx, key, groupIp, id)

其中 HashMapSet 函数调用实际的 HSet 函数,如下所示。

func (r *repository) HashMapSet(ctx context.Context, key string, values ...interface{}) (int64, error) {
    intCmd := r.Client.HSet(ctx, key, values...)
    log.WithFields(log.Fields{"key": key, "values": values, "result": intCmd}).Debug("repo-hashmapset")
    return intCmd.Result()
}

以下是我看到的输出:

DEBU[2023-03-13T22:44:35.191449159+03:00] repo-hashmapset                               key=ig_groupids/55 result="hset ig_groupids/55 239.254.1.175 432: context deadline exceeded" values="[239.254.1.175 432]"
INFO[2023-03-13T22:44:35.191572577+03:00] context deadline exceeded                     group-ip=239.254.1.175
DEBU[2023-03-13T22:44:35.211896763+03:00] repo-hashmapset                               key=ig_groupids/55 result="hset ig_groupids/55 239.254.1.176 432: context deadline exceeded" values="[239.254.1.176 432]"
INFO[2023-03-13T22:44:35.212052712+03:00] context deadline exceeded                     group-ip=239.254.1.176
DEBU[2023-03-13T22:44:35.232327292+03:00] repo-hashmapset                               key=ig_groupids/55 result="hset ig_groupids/55 239.254.1.177 432: context deadline exceeded" values="[239.254.1.177 432]"
INFO[2023-03-13T22:44:35.232373678+03:00] context deadline exceeded                     group-ip=239.254.1.177
DEBU[2023-03-13T22:44:35.252736679+03:00] repo-hashmapset                               key=ig_groupids/55 result="hset ig_groupids/55 239.254.1.178 432: context deadline exceeded" values="[239.254.1.178 432]"
INFO[2023-03-13T22:44:35.252776536+03:00] context deadline exceeded                     group-ip=239.254.1.178
DEBU[2023-03-13T22:44:35.273120216+03:00] repo-hashmapset            

它与吗?因为在我看来,这里的所有调用都使用了相同的上下文。在 9 到 10 秒等一段时间后,应用程序开始生成这些输出。我使用的不是.它也可能与创建或初始化 Redis 连接的方式有关吗?在启动阶段,我没有通过任何超时或类似的东西。context.WitValuecontext deadline exceededredisredis-sentinel

Go Redis 截止日期

评论

4赞 Burak Serdar 3/14/2023
您是否为传递到的上下文设置了截止日期?您显示的代码中没有截止时间。context.WithValue
1赞 Erwin Bolwidt 3/14/2023
您至少应该在循环中检查上下文是否被取消或超过截止时间,因为在此之后没有继续的意义(任何使用上下文的 IO 或其他操作都将立即失败):if ctx.Err() != nil { break }
0赞 baris 3/14/2023
@BurakSerdar 不,我没有为上下文设定任何截止日期。我刚刚注意到此处未列出的第一个函数已将超时传递到。我想这是我应该关注的问题。context.WithTimeout
0赞 baris 3/14/2023
@ErwinBolwidt好的。发生这种情况是因为完成需要太多时间吗?如何确保它不会触发错误并完成所有操作。context deadline exceeded
1赞 Erwin Bolwidt 3/15/2023
@baris不要在您使用的上下文上设置截止时间或超时。你可以只使用一个新的context.Background()

答: 暂无答案