redisclustermanager.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package redis
  2. import (
  3. "crypto/tls"
  4. "io"
  5. "runtime"
  6. "strings"
  7. red "github.com/go-redis/redis/v8"
  8. "github.com/zeromicro/go-zero/core/syncx"
  9. )
  10. const addrSep = ","
  11. var (
  12. clusterManager = syncx.NewResourceManager()
  13. // clusterPoolSize is default pool size for cluster type of redis.
  14. clusterPoolSize = 5 * runtime.GOMAXPROCS(0)
  15. )
  16. func getCluster(r *Redis) (*red.ClusterClient, error) {
  17. val, err := clusterManager.GetResource(r.Addr, func() (io.Closer, error) {
  18. var tlsConfig *tls.Config
  19. if r.tls {
  20. tlsConfig = &tls.Config{
  21. InsecureSkipVerify: true,
  22. }
  23. }
  24. store := red.NewClusterClient(&red.ClusterOptions{
  25. Addrs: splitClusterAddrs(r.Addr),
  26. Password: r.Pass,
  27. MaxRetries: maxRetries,
  28. MinIdleConns: idleConns,
  29. TLSConfig: tlsConfig,
  30. })
  31. store.AddHook(durationHook)
  32. for _, hook := range r.hooks {
  33. store.AddHook(hook)
  34. }
  35. connCollector.registerClient(&statGetter{
  36. clientType: ClusterType,
  37. key: r.Addr,
  38. poolSize: clusterPoolSize,
  39. poolStats: func() *red.PoolStats {
  40. return store.PoolStats()
  41. },
  42. })
  43. return store, nil
  44. })
  45. if err != nil {
  46. return nil, err
  47. }
  48. return val.(*red.ClusterClient), nil
  49. }
  50. func splitClusterAddrs(addr string) []string {
  51. addrs := strings.Split(addr, addrSep)
  52. unique := make(map[string]struct{})
  53. for _, each := range addrs {
  54. unique[strings.TrimSpace(each)] = struct{}{}
  55. }
  56. addrs = addrs[:0]
  57. for k := range unique {
  58. addrs = append(addrs, k)
  59. }
  60. return addrs
  61. }