php Editor Banana kann bei der Verwendung von Redis auf ein Problem stoßen: Obwohl die Daten vorhanden sind, erscheint in rdb.Pipelined ein „redis:nil“-Fehler. Dieser Fehler kann dazu führen, dass die Daten nicht korrekt gelesen werden, was zu Problemen im Programm führt. Bevor wir dieses Problem lösen können, müssen wir zunächst seine Ursachen und mögliche Lösungen verstehen. In diesem Artikel werde ich dieses Problem im Detail für Sie analysieren und einige praktische Lösungen anbieten, die Ihnen helfen, diesen Fehler reibungslos zu beheben.
Fehler bei der Verwendung von rdb.Pipelined
时,我在 Go 中遇到 github.com/go-redis/redis/v9
包的问题。我有一个包含两个 Get 查询的管道,一个数据存在,而第二个不存在。但我仍然收到 redis: nil
.
Dies ist der Beispielcode:
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“ existiert in Redis, aber „key2“ existiert nicht. Ich kann dies mithilfe der Redis-CLI überprüfen. Wenn ich das tue rdb.Get(ctx, "key1").Result()
, werden auch die Daten zurückgegeben.
Das Gleiche funktioniert in einer Staging-Umgebung auf EC2 einwandfrei.
Ich habe nach Tippfehlern gesucht und sichergestellt, dass der Schlüssel vorhanden ist. Was ist der Grund für diesen Unterschied? Wie löst man?
Weitere Informationen: Redis-Serverversion: 7.0.11 Go-Redis-Version: v9.1.0 Go-Version: go1.21.0 darwin/arm64 Betriebssystem: MacOs
Vielen Dank für alle Erkenntnisse oder Vorschläge zur Fehlerbehebung und Lösung dieses Problems.
Wir können dies im go-redis
Quellcode finden:
<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>
Vielleicht kannst du es also so verwenden:
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) }
Das obige ist der detaillierte Inhalt vonRedis: Fehler „redis: nil' in rdb.Pipelined, obwohl Daten vorhanden sind. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!