From 7a0c04bc21b0791cc0b4b1881dbd1cfdadd3540d Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Fri, 10 Mar 2023 16:09:07 +0800 Subject: [PATCH] feat: unique redis addrs and trim spaces (#3004) --- core/stores/redis/redisblockingnode.go | 3 +- core/stores/redis/redisclustermanager.go | 19 +++++++- core/stores/redis/redisclustermanager_test.go | 43 +++++++++++++++++++ 3 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 core/stores/redis/redisclustermanager_test.go diff --git a/core/stores/redis/redisblockingnode.go b/core/stores/redis/redisblockingnode.go index bdb47871..106df626 100644 --- a/core/stores/redis/redisblockingnode.go +++ b/core/stores/redis/redisblockingnode.go @@ -2,7 +2,6 @@ package redis import ( "fmt" - "strings" red "github.com/go-redis/redis/v8" "github.com/zeromicro/go-zero/core/logx" @@ -32,7 +31,7 @@ func CreateBlockingNode(r *Redis) (ClosableNode, error) { return &clientBridge{client}, nil case ClusterType: client := red.NewClusterClient(&red.ClusterOptions{ - Addrs: strings.Split(r.Addr, ","), + Addrs: splitClusterAddrs(r.Addr), Password: r.Pass, MaxRetries: maxRetries, PoolSize: 1, diff --git a/core/stores/redis/redisclustermanager.go b/core/stores/redis/redisclustermanager.go index 1f1e1b19..dda1bcdb 100644 --- a/core/stores/redis/redisclustermanager.go +++ b/core/stores/redis/redisclustermanager.go @@ -9,6 +9,8 @@ import ( "github.com/zeromicro/go-zero/core/syncx" ) +const addrSep = "," + var clusterManager = syncx.NewResourceManager() func getCluster(r *Redis) (*red.ClusterClient, error) { @@ -20,7 +22,7 @@ func getCluster(r *Redis) (*red.ClusterClient, error) { } } store := red.NewClusterClient(&red.ClusterOptions{ - Addrs: strings.Split(r.Addr, ","), + Addrs: splitClusterAddrs(r.Addr), Password: r.Pass, MaxRetries: maxRetries, MinIdleConns: idleConns, @@ -36,3 +38,18 @@ func getCluster(r *Redis) (*red.ClusterClient, error) { 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 +} diff --git a/core/stores/redis/redisclustermanager_test.go b/core/stores/redis/redisclustermanager_test.go new file mode 100644 index 00000000..5782ce22 --- /dev/null +++ b/core/stores/redis/redisclustermanager_test.go @@ -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)) + }) + } +}