github.com/wfusion/gofusion@v1.1.14/common/infra/drivers/redis/redis.go (about) 1 package redis 2 3 import ( 4 "context" 5 "time" 6 7 "github.com/redis/go-redis/v9" 8 9 "github.com/wfusion/gofusion/common/utils" 10 ) 11 12 var Default Dialect = new(defaultDialect) 13 14 type defaultDialect struct{} 15 16 func (d *defaultDialect) New(ctx context.Context, option Option, opts ...utils.OptionExtender) ( 17 r *Redis, err error) { 18 if option.Cluster { 19 opt := d.parseClusterOption(option) 20 d.wrapDurationSetter(option.PoolTimeout, func(du time.Duration) { opt.PoolTimeout = du }) 21 d.wrapDurationSetter(option.DialTimeout, func(du time.Duration) { opt.DialTimeout = du }) 22 d.wrapDurationSetter(option.ReadTimeout, func(du time.Duration) { opt.ReadTimeout = du }) 23 d.wrapDurationSetter(option.WriteTimeout, func(du time.Duration) { opt.WriteTimeout = du }) 24 d.wrapDurationSetter(option.ConnMaxIdleTime, func(du time.Duration) { opt.ConnMaxIdleTime = du }) 25 d.wrapDurationSetter(option.ConnMaxLifetime, func(du time.Duration) { opt.ConnMaxLifetime = du }) 26 d.wrapDurationSetter(option.MinRetryBackoff, func(du time.Duration) { opt.MinRetryBackoff = du }) 27 d.wrapDurationSetter(option.MaxRetryBackoff, func(du time.Duration) { opt.MaxRetryBackoff = du }) 28 29 rdsCli := redis.NewClusterClient(opt) 30 31 // authentication check 32 if err = rdsCli.Ping(context.Background()).Err(); err != nil { 33 return 34 } 35 36 newOpt := utils.ApplyOptions[newOption](opts...) 37 for _, hook := range newOpt.hooks { 38 rdsCli.AddHook(hook) 39 } 40 41 return &Redis{redis: rdsCli}, nil 42 43 } else { 44 opt := d.parseOption(option) 45 d.wrapDurationSetter(option.PoolTimeout, func(du time.Duration) { opt.PoolTimeout = du }) 46 d.wrapDurationSetter(option.DialTimeout, func(du time.Duration) { opt.DialTimeout = du }) 47 d.wrapDurationSetter(option.ReadTimeout, func(du time.Duration) { opt.ReadTimeout = du }) 48 d.wrapDurationSetter(option.WriteTimeout, func(du time.Duration) { opt.WriteTimeout = du }) 49 d.wrapDurationSetter(option.ConnMaxIdleTime, func(du time.Duration) { opt.ConnMaxIdleTime = du }) 50 d.wrapDurationSetter(option.ConnMaxLifetime, func(du time.Duration) { opt.ConnMaxLifetime = du }) 51 d.wrapDurationSetter(option.MinRetryBackoff, func(du time.Duration) { opt.MinRetryBackoff = du }) 52 d.wrapDurationSetter(option.MaxRetryBackoff, func(du time.Duration) { opt.MaxRetryBackoff = du }) 53 54 rdsCli := redis.NewClient(opt) 55 56 // authentication check 57 if err = rdsCli.Ping(context.Background()).Err(); err != nil { 58 return 59 } 60 61 newOpt := utils.ApplyOptions[newOption](opts...) 62 for _, hook := range newOpt.hooks { 63 rdsCli.AddHook(hook) 64 } 65 66 return &Redis{redis: rdsCli}, nil 67 } 68 } 69 70 func (d *defaultDialect) wrapDurationSetter(s string, setter func(du time.Duration)) { 71 if utils.IsStrBlank(s) { 72 return 73 } 74 duration, err := time.ParseDuration(s) 75 if err != nil { 76 panic(err) 77 } 78 setter(duration) 79 } 80 81 func (d *defaultDialect) parseOption(option Option) (cfg *redis.Options) { 82 return &redis.Options{ 83 Addr: option.Endpoints[0], 84 Username: option.User, 85 Password: option.Password, 86 MaxRetries: option.MaxRetries, 87 MinIdleConns: option.MinIdleConns, 88 MaxIdleConns: option.MaxIdleConns, 89 PoolSize: option.PoolSize, 90 } 91 } 92 93 func (d *defaultDialect) parseClusterOption(option Option) (cfg *redis.ClusterOptions) { 94 return &redis.ClusterOptions{ 95 Addrs: option.Endpoints, 96 Username: option.User, 97 Password: option.Password, 98 MaxRetries: option.MaxRetries, 99 MinIdleConns: option.MinIdleConns, 100 MaxIdleConns: option.MaxIdleConns, 101 PoolSize: option.PoolSize, 102 } 103 }