Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Redis: ralat "redis: nil" dalam rdb.Disambungkan walaupun data wujud

Redis: ralat "redis: nil" dalam rdb.Disambungkan walaupun data wujud

PHPz
PHPzke hadapan
2024-02-09 11:50:09432semak imbas

Redis:尽管数据存在,但 rdb.Pipelined 中出现“redis:nil”错误

php Editor Pisang mungkin menghadapi masalah apabila menggunakan Redis: walaupun data wujud, ralat "redis:nil" muncul dalam rdb.Pipelined. Ralat ini boleh menyebabkan data tidak dibaca dengan betul, menyebabkan masalah kepada atur cara. Sebelum menyelesaikan masalah ini, kita perlu memahami punca dan kemungkinan penyelesaiannya. Dalam artikel ini, saya akan menganalisis masalah ini secara terperinci untuk anda dan menyediakan beberapa penyelesaian praktikal untuk membantu anda menyelesaikan ralat ini dengan lancar.

Kandungan soalan

Ralat semasa menggunakan rdb.Pipelined 时,我在 Go 中遇到 github.com/go-redis/redis/v9 包的问题。我有一个包含两个 Get 查询的管道,一个数据存在,而第二个不存在。但我仍然收到 redis: nil.

Ini adalah contoh kod:

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)
}

"key1" wujud dalam redis, tetapi "key2" tidak wujud. Saya boleh mengesahkan ini menggunakan Redis CLI. Apabila saya lakukan rdb.Get(ctx, "key1").Result() ia juga mengembalikan data. Perkara yang sama berfungsi dengan baik dalam persekitaran pementasan pada EC2.

Saya telah menyemak kesilapan menaip dan memastikan kunci itu wujud. Apakah sebab perbezaan ini? Bagaimana untuk menyelesaikannya?

Maklumat lain: Versi pelayan Redis: 7.0.11 Versi Go-Redis: v9.1.0 Versi Go: go1.21.0 darwin/arm64 Sistem pengendalian: MacOs

Terima kasih atas sebarang cerapan atau cadangan tentang cara menyelesaikan masalah dan menyelesaikan isu ini.

Penyelesaian

Kita boleh temui ini dalam go-rediskod sumber:

<code>// 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)
}
</code>

Jadi mungkin anda boleh menggunakannya seperti ini:

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)
}

Atas ialah kandungan terperinci Redis: ralat "redis: nil" dalam rdb.Disambungkan walaupun data wujud. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam