Maison  >  Article  >  développement back-end  >  Redis : erreur "redis : nil" dans rdb.Pipelined bien que les données existent

Redis : erreur "redis : nil" dans rdb.Pipelined bien que les données existent

PHPz
PHPzavant
2024-02-09 11:50:09431parcourir

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

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.

Contenu de la question

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.

Solution de contournement

Nous pouvons trouver cela dans le go-rediscode 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer