Maison > développement back-end > Golang > le corps du texte

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

PHPz
Libérer: 2024-02-09 11:50:09
avant
458 Les gens l'ont consulté

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)
}
Copier après la connexion

"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>
Copier après la connexion

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)
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!