繁体   English   中英

go-redis maxRetries 不适用于 redis 管道

[英]go-redis maxRetries doesn't work with redis pipeline

我正在尝试使用 go-redis 客户端的maxRetries选项。

package main

import (
    "context"
    "fmt"
    "log"
    "time"

    "github.com/go-redis/redis/v8"
)

func main() {
    db := redis.NewUniversalClient(&redis.UniversalOptions{
        Addrs:           []string{"localhost:6379"},
        PoolTimeout:     time.Duration(10) * time.Minute,
        MaxRetries:      3,
        MinRetryBackoff: 5 * time.Second,
        MaxRetryBackoff: 5 * time.Second,
    })

    ctx := context.Background()
    var i int64

    /*for i = 0; i <= 10000; i += 100 {
        time.Sleep(time.Second * 2)
        fmt.Println("i : ", i)
        test, err := db.HIncrBy(ctx, "testkv", "test", i).Result()
        log.Println("Increment result ", test, err)
        val, valerr := db.HGet(ctx, "testkv", "test").Result()
        log.Println("The new value of test is ", val, valerr)
    }*/

    for i = 0; i <= 10000; i += 100 {
        time.Sleep(time.Second * 2)
        fmt.Println("i : ", i)
        pipe := db.Pipeline()
        testRes := pipe.HIncrBy(ctx, "testkv", "test", i)
        valRes := pipe.HGet(ctx, "testkv", "test")
        _, err := pipe.Exec(ctx)
        pipe.Close()
        log.Println("Pipe Err: ", err)

        test, err := testRes.Result()
        log.Println("Increment result ", test, err)
        val, valerr := valRes.Result()
        log.Println("The new value of test is ", val, valerr)
    }
}

上面注释的代码没有管道。 在这种情况下,如果 redis 关闭,则在执行循环时我会看到命令的执行被阻塞直到 15 秒(由于重试),然后执行下一个命令。 一旦出现 redis,循环将继续并成功执行命令。 在管道场景的情况下,不会发生这种阻塞情况。 任何帮助表示赞赏。 谢谢。

根据这个问题,集群客户端不会在管道读取超时时重试,重试策略不适用于管道。

动机是我们不应该尝试重试管道的一半,因为用户可能依赖管道中的所有命令一起执行一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM