mirror of
https://github.com/redis/go-redis.git
synced 2026-10-28 08:24:54 +08:00
* add dial retry backoff function. * add readme * add backoff to wordlist * add logical consistency check * fix(cluster): propagate DialerRetryBackoff to per-node clients ClusterOptions.clientOptions() was not propagating DialerRetryBackoff, causing the backoff function to be silently ignored when set on a cluster client. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
40 lines
1.0 KiB
Go
40 lines
1.0 KiB
Go
package redis
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/redis/go-redis/v9/internal"
|
|
)
|
|
|
|
// DialRetryBackoffConstant returns a dial retry backoff function that always returns d.
|
|
// attempt is 0-based: attempt=0 is the delay after the 1st failed dial.
|
|
func DialRetryBackoffConstant(d time.Duration) func(attempt int) time.Duration {
|
|
if d < 0 {
|
|
d = 0
|
|
}
|
|
return func(int) time.Duration { return d }
|
|
}
|
|
|
|
// DialRetryBackoffExponential returns a dial retry backoff function that uses exponential
|
|
// backoff with jitter and a cap, using internal.RetryBackoff.
|
|
//
|
|
// attempt is 0-based: attempt=0 is the delay after the 1st failed dial.
|
|
func DialRetryBackoffExponential(minBackoff, maxBackoff time.Duration) func(attempt int) time.Duration {
|
|
if minBackoff < 0 {
|
|
minBackoff = 0
|
|
}
|
|
if maxBackoff < 0 {
|
|
maxBackoff = 0
|
|
}
|
|
if minBackoff > maxBackoff {
|
|
minBackoff = maxBackoff
|
|
}
|
|
return func(attempt int) time.Duration {
|
|
// internal.RetryBackoff expects retry >= 0.
|
|
if attempt < 0 {
|
|
attempt = 0
|
|
}
|
|
return internal.RetryBackoff(attempt, minBackoff, maxBackoff)
|
|
}
|
|
}
|