redisclustermanager.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. for _, hook := range r.hooks {
  28. store.AddHook(hook)
  29. }
  30. return store, nil
  31. })
  32. if err != nil {
  33. return nil, err
  34. }
  35. return val.(*red.ClusterClient), nil
  36. }
  37. func splitClusterAddrs(addr string) []string {
  38. addrs := strings.Split(addr, addrSep)
  39. unique := make(map[string]struct{})
  40. for _, each := range addrs {
  41. unique[strings.TrimSpace(each)] = struct{}{}
  42. }
  43. addrs = addrs[:0]
  44. for k := range unique {
  45. addrs = append(addrs, k)
  46. }
  47. return addrs
  48. }