Heim  >  Artikel  >  Backend-Entwicklung  >  Redis: Fehler „redis: nil“ in rdb.Pipelined, obwohl Daten vorhanden sind

Redis: Fehler „redis: nil“ in rdb.Pipelined, obwohl Daten vorhanden sind

PHPz
PHPznach vorne
2024-02-09 11:50:09432Durchsuche

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

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.

Frageninhalt

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.

Workaround

Wir können dies im go-redisQuellcode 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen