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

PHPz
Lepaskan: 2024-02-09 11:50:09
ke hadapan
458 orang telah melayarinya

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)
}
Salin selepas log masuk

"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>
Salin selepas log masuk

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)
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!