mirror of https://github.com/go-redis/redis.git
chore: lazy reload when moved or ask
This commit is contained in:
parent
98bb99ddc2
commit
86258a11a9
20
cluster.go
20
cluster.go
|
@ -352,7 +352,7 @@ func (c *clusterNodes) GC(generation uint32) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *clusterNodes) Get(addr string) (*clusterNode, error) {
|
func (c *clusterNodes) GetOrCreate(addr string) (*clusterNode, error) {
|
||||||
node, err := c.get(addr)
|
node, err := c.get(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -416,7 +416,7 @@ func (c *clusterNodes) Random() (*clusterNode, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
n := rand.Intn(len(addrs))
|
n := rand.Intn(len(addrs))
|
||||||
return c.Get(addrs[n])
|
return c.GetOrCreate(addrs[n])
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
@ -474,7 +474,7 @@ func newClusterState(
|
||||||
addr = replaceLoopbackHost(addr, originHost)
|
addr = replaceLoopbackHost(addr, originHost)
|
||||||
}
|
}
|
||||||
|
|
||||||
node, err := c.nodes.Get(addr)
|
node, err := c.nodes.GetOrCreate(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -824,8 +824,10 @@ func (c *ClusterClient) process(ctx context.Context, cmd Cmder) error {
|
||||||
var addr string
|
var addr string
|
||||||
moved, ask, addr = isMovedError(lastErr)
|
moved, ask, addr = isMovedError(lastErr)
|
||||||
if moved || ask {
|
if moved || ask {
|
||||||
|
c.state.LazyReload()
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
node, err = c.nodes.Get(addr)
|
node, err = c.nodes.GetOrCreate(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1022,7 +1024,7 @@ func (c *ClusterClient) loadState(ctx context.Context) (*clusterState, error) {
|
||||||
for _, idx := range rand.Perm(len(addrs)) {
|
for _, idx := range rand.Perm(len(addrs)) {
|
||||||
addr := addrs[idx]
|
addr := addrs[idx]
|
||||||
|
|
||||||
node, err := c.nodes.Get(addr)
|
node, err := c.nodes.GetOrCreate(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if firstErr == nil {
|
if firstErr == nil {
|
||||||
firstErr = err
|
firstErr = err
|
||||||
|
@ -1236,7 +1238,7 @@ func (c *ClusterClient) checkMovedErr(
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
node, err := c.nodes.Get(addr)
|
node, err := c.nodes.GetOrCreate(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -1422,7 +1424,7 @@ func (c *ClusterClient) cmdsMoved(
|
||||||
addr string,
|
addr string,
|
||||||
failedCmds *cmdsMap,
|
failedCmds *cmdsMap,
|
||||||
) error {
|
) error {
|
||||||
node, err := c.nodes.Get(addr)
|
node, err := c.nodes.GetOrCreate(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1477,7 +1479,7 @@ func (c *ClusterClient) Watch(ctx context.Context, fn func(*Tx) error, keys ...s
|
||||||
|
|
||||||
moved, ask, addr := isMovedError(err)
|
moved, ask, addr := isMovedError(err)
|
||||||
if moved || ask {
|
if moved || ask {
|
||||||
node, err = c.nodes.Get(addr)
|
node, err = c.nodes.GetOrCreate(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1589,7 +1591,7 @@ func (c *ClusterClient) cmdsInfo(ctx context.Context) (map[string]*CommandInfo,
|
||||||
for _, idx := range perm {
|
for _, idx := range perm {
|
||||||
addr := addrs[idx]
|
addr := addrs[idx]
|
||||||
|
|
||||||
node, err := c.nodes.Get(addr)
|
node, err := c.nodes.GetOrCreate(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if firstErr == nil {
|
if firstErr == nil {
|
||||||
firstErr = err
|
firstErr = err
|
||||||
|
|
4
redis.go
4
redis.go
|
@ -710,7 +710,9 @@ type conn struct {
|
||||||
hooks // TODO: inherit hooks
|
hooks // TODO: inherit hooks
|
||||||
}
|
}
|
||||||
|
|
||||||
// Conn is like Client, but its pool contains single connection.
|
// Conn represents a single Redis connection rather than a pool of connections.
|
||||||
|
// Prefer running commands from Client unless there is a specific need
|
||||||
|
// for a continuous single Redis connection.
|
||||||
type Conn struct {
|
type Conn struct {
|
||||||
*conn
|
*conn
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
|
|
Loading…
Reference in New Issue