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.
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.
Kita boleh temui ini dalam go-redis
kod 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!