redisclustermanager.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package redis
  2. import (
  3. "crypto/tls"
  4. "io"
  5. "strings"
  6. red "github.com/go-redis/redis/v8"
  7. "github.com/zeromicro/go-zero/core/syncx"
  8. )
  9. const addrSep = ","
  10. var clusterManager = syncx.NewResourceManager()
  11. func getCluster(r *Redis) (*red.ClusterClient, error) {
  12. val, err := clusterManager.GetResource(r.Addr, func() (io.Closer, error) {
  13. var tlsConfig *tls.Config
  14. if r.tls {
  15. tlsConfig = &tls.Config{
  16. InsecureSkipVerify: true,
  17. }
  18. }
  19. store := red.NewClusterClient(&red.ClusterOptions{
  20. Addrs: splitClusterAddrs(r.Addr),
  21. Password: r.Pass,
  22. MaxRetries: maxRetries,
  23. MinIdleConns: idleConns,
  24. TLSConfig: tlsConfig,
  25. })
  26. store.AddHook(durationHook)
  27. return store, nil
  28. })
  29. if err != nil {
  30. return nil, err
  31. }
  32. return val.(*red.ClusterClient), nil
  33. }
  34. func splitClusterAddrs(addr string) []string {
  35. addrs := strings.Split(addr, addrSep)
  36. unique := make(map[string]struct{})
  37. for _, each := range addrs {
  38. unique[strings.TrimSpace(each)] = struct{}{}
  39. }
  40. addrs = addrs[:0]
  41. for k := range unique {
  42. addrs = append(addrs, k)
  43. }
  44. return addrs
  45. }