feat: unique redis addrs and trim spaces (#3004)

master
Kevin Wan 2 years ago committed by GitHub
parent 3c9fe0b381
commit 7a0c04bc21
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -2,7 +2,6 @@ package redis
import ( import (
"fmt" "fmt"
"strings"
red "github.com/go-redis/redis/v8" red "github.com/go-redis/redis/v8"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
@ -32,7 +31,7 @@ func CreateBlockingNode(r *Redis) (ClosableNode, error) {
return &clientBridge{client}, nil return &clientBridge{client}, nil
case ClusterType: case ClusterType:
client := red.NewClusterClient(&red.ClusterOptions{ client := red.NewClusterClient(&red.ClusterOptions{
Addrs: strings.Split(r.Addr, ","), Addrs: splitClusterAddrs(r.Addr),
Password: r.Pass, Password: r.Pass,
MaxRetries: maxRetries, MaxRetries: maxRetries,
PoolSize: 1, PoolSize: 1,

@ -9,6 +9,8 @@ import (
"github.com/zeromicro/go-zero/core/syncx" "github.com/zeromicro/go-zero/core/syncx"
) )
const addrSep = ","
var clusterManager = syncx.NewResourceManager() var clusterManager = syncx.NewResourceManager()
func getCluster(r *Redis) (*red.ClusterClient, error) { func getCluster(r *Redis) (*red.ClusterClient, error) {
@ -20,7 +22,7 @@ func getCluster(r *Redis) (*red.ClusterClient, error) {
} }
} }
store := red.NewClusterClient(&red.ClusterOptions{ store := red.NewClusterClient(&red.ClusterOptions{
Addrs: strings.Split(r.Addr, ","), Addrs: splitClusterAddrs(r.Addr),
Password: r.Pass, Password: r.Pass,
MaxRetries: maxRetries, MaxRetries: maxRetries,
MinIdleConns: idleConns, MinIdleConns: idleConns,
@ -36,3 +38,18 @@ func getCluster(r *Redis) (*red.ClusterClient, error) {
return val.(*red.ClusterClient), nil return val.(*red.ClusterClient), nil
} }
func splitClusterAddrs(addr string) []string {
addrs := strings.Split(addr, addrSep)
unique := make(map[string]struct{})
for _, each := range addrs {
unique[strings.TrimSpace(each)] = struct{}{}
}
addrs = addrs[:0]
for k := range unique {
addrs = append(addrs, k)
}
return addrs
}

@ -0,0 +1,43 @@
package redis
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestSplitClusterAddrs(t *testing.T) {
testCases := []struct {
name string
input string
expected []string
}{
{
name: "empty input",
input: "",
expected: []string{""},
},
{
name: "single address",
input: "127.0.0.1:8000",
expected: []string{"127.0.0.1:8000"},
},
{
name: "multiple addresses with duplicates",
input: "127.0.0.1:8000,127.0.0.1:8001, 127.0.0.1:8000",
expected: []string{"127.0.0.1:8000", "127.0.0.1:8001"},
},
{
name: "multiple addresses without duplicates",
input: "127.0.0.1:8000, 127.0.0.1:8001, 127.0.0.1:8002",
expected: []string{"127.0.0.1:8000", "127.0.0.1:8001", "127.0.0.1:8002"},
},
}
for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
assert.ElementsMatch(t, tc.expected, splitClusterAddrs(tc.input))
})
}
}
Loading…
Cancel
Save