feat: unique redis addrs and trim spaces (#3004)
This commit is contained in:
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
43
core/stores/redis/redisclustermanager_test.go
Normal file
43
core/stores/redis/redisclustermanager_test.go
Normal file
@@ -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))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user