我在围棋中使用rdb.Pipelined的时候遇到了github.com/go-redis/redis/v9包的问题.我有一个带有两个GET查询的管道,一个数据存在,而另一个不存在.但我仍然收到redis: nil个错误.

以下是示例代码:

ctx := context.Background()

_, err := rdb.Pipelined(ctx, func(pipe redis.Pipeliner) error {
    pipe.Get(ctx, "key1")

    pipe.Get(ctx, "key2")

    return nil
})

if err != nil {
    log.Printf("Error executing pipeline: %v", err)
}

在Redis中存在"key1",而"key2"不存在.我可以使用Redis CLI进行验证.当我做rdb.Get(ctx, "key1").Result()时,它也会返回数据. 同样的情况也适用于EC2上的试运行环境.

我已经判断了打字错误,并确保密钥存在.是什么导致了这种差异,我如何解决它?

Additional Information: Redis服务器版本:7.0.11 Go-Redis版本:v9.1.0 围棋版本:go1.21.0 Darwin/arm64 操作系统:MacOS

我非常感谢任何关于如何排除故障并解决此问题的见解或建议.

推荐答案

我们可以在go-redis个源代码中找到以下内容:

// Exec executes all previously queued commands using one
// client-server roundtrip.
//
// Exec always returns list of commands and error of the first failed
// command if any.
func (c *Pipeline) Exec(ctx context.Context) ([]Cmder, error) {
    if len(c.cmds) == 0 {
        return nil, nil
    }

    cmds := c.cmds
    c.cmds = nil

    return cmds, c.exec(ctx, cmds)
}

func (c *Pipeline) Pipelined(ctx context.Context, fn func(Pipeliner) error) ([]Cmder, error) {
    if err := fn(c); err != nil {
        return nil, err
    }
    return c.Exec(ctx)
}

所以也许你可以这样使用它:

var results []string
cmds, _ := cli.Pipelined(context.TODO(), func(pipeliner redis.Pipeliner) error {
    return nil
})
for _, cmd := range cmds {
    if cmd.Err() != nil && cmd.Err() != redis.Nil {
        // log error
        continue
    }
    res := cmd.(*redis.StringCmd).Val()
    results = append(results, res)
}

Go相关问答推荐

消费者在NAT中是如何实现的

运行add. inf,这样我们就可以在app.conf中使用. inf参数了?

Golang XML密钥名称冲突

使用Digitorus/pdfsign在GO(Golang)中签署pdf文件

使用Go使用Gorm使用外键对数据进行排序

如何在 Chi Router 的受保护路由下提供静态文件(尤其是图像)?

Fizz对Gin的OpenAPI生成器正在重命名类型

使用Goldmark在golang中添加ChildNode会导致堆栈溢出

Go struct 匿名字段是公开的还是私有的?

Go Template if 条件

闭包所处的环境范围是什么?

判断不同 go map 类型中的重复键

为什么互斥量比 golang 中的通道慢?

无法访问 Go 模块导入的远程存储库

vs 代码调试 go 测试不通过标志

使用 image/jpeg 编码导致图像饱和/错误像素

如何优雅地映射到 Go 中返回可变长度数组的方法?

如何在 Prometheus 中正确检测区域和环境信息?

有没有一种方法可以确保传递的值具有使用泛型的某些字段?

如何在程序退出时使用 golang 删除文件?