go-micro.dev/v5@v5.12.0/cache/redis/options.go (about)

     1  package redis
     2  
     3  import (
     4  	"context"
     5  
     6  	rclient "github.com/go-redis/redis/v8"
     7  	"go-micro.dev/v5/cache"
     8  )
     9  
    10  type redisOptionsContextKey struct{}
    11  
    12  // WithRedisOptions sets advanced options for redis.
    13  func WithRedisOptions(options rclient.UniversalOptions) cache.Option {
    14  	return func(o *cache.Options) {
    15  		if o.Context == nil {
    16  			o.Context = context.Background()
    17  		}
    18  
    19  		o.Context = context.WithValue(o.Context, redisOptionsContextKey{}, options)
    20  	}
    21  }
    22  
    23  func newUniversalClient(options cache.Options) rclient.UniversalClient {
    24  	if options.Context == nil {
    25  		options.Context = context.Background()
    26  	}
    27  
    28  	opts, ok := options.Context.Value(redisOptionsContextKey{}).(rclient.UniversalOptions)
    29  	if !ok {
    30  		addr := "redis://127.0.0.1:6379"
    31  		if len(options.Address) > 0 {
    32  			addr = options.Address
    33  		}
    34  
    35  		redisOptions, err := rclient.ParseURL(addr)
    36  		if err != nil {
    37  			redisOptions = &rclient.Options{Addr: addr}
    38  		}
    39  
    40  		return rclient.NewClient(redisOptions)
    41  	}
    42  
    43  	if len(opts.Addrs) == 0 && len(options.Address) > 0 {
    44  		opts.Addrs = []string{options.Address}
    45  	}
    46  
    47  	return rclient.NewUniversalClient(&opts)
    48  }