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  }