简体   繁体   中英

go-redis maxRetries doesn't work with redis pipeline

I am trying to use maxRetries option of go-redis client.

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)
    }
}

The above commented code is without pipeline. In that case, while the loop is being executed if redis goes off then I see command's execution getting blocked until 15seconds (due to retry) and then the next command is executed. Once, redis comes up, the loop continues with successful execution of the command. This blocking thing is not happening in case of the pipeline scenario. Any help is appreciated. Thanks.

Per this issue cluster client doesn't retry on pipeline read timeouts , the retry policy does NOT apply to the pipeline.

The motivation was that we should not try to retry half of the pipeline, because it can be that user relies that all commands in pipeline are executed together once.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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