php Editor Banana peut rencontrer un problème lors de l'utilisation de Redis : bien que les données existent, une erreur "redis:nil" apparaît dans rdb.Pipelined. Cette erreur peut empêcher la lecture correcte des données, entraînant des problèmes avec le programme. Avant de résoudre ce problème, nous devons d’abord comprendre ses causes et les solutions possibles. Dans cet article, j'analyserai ce problème en détail pour vous et vous proposerai quelques solutions pratiques pour vous aider à résoudre cette erreur en douceur.
Erreur lors de l'utilisation de rdb.Pipelined
时,我在 Go 中遇到 github.com/go-redis/redis/v9
包的问题。我有一个包含两个 Get 查询的管道,一个数据存在,而第二个不存在。但我仍然收到 redis: nil
.
Voici un exemple de code :
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" existe dans Redis, mais "key2" n'existe pas. Je peux le vérifier à l'aide de la CLI Redis. Quand je le fais rdb.Get(ctx, "key1").Result()
, il renvoie également les données.
La même chose fonctionne bien dans un environnement de test sur EC2.
J'ai vérifié les fautes de frappe et je me suis assuré que la clé existe. Quelle est la raison de cette différence ? Comment résoudre?
Autres informations : Version du serveur Redis : 7.0.11 Version Go-Redis : v9.1.0 Version Go : go1.21.0 darwin/arm64 Système d'exploitation : MacOs
Merci pour toute idée ou suggestion sur la façon de dépanner et de résoudre ce problème.
Nous pouvons trouver cela dans le go-redis
code source :
<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>
Alors peut-être que vous pouvez l'utiliser comme ceci :
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) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!