github.com/charlienet/go-mixed@v0.3.7/cache/cache_builder.go (about)

     1  package cache
     2  
     3  import "github.com/charlienet/go-mixed/logx"
     4  
     5  const defaultPrefix = "cache"
     6  
     7  type option func(*Cache) error
     8  
     9  type options struct {
    10  	Prefix string
    11  }
    12  
    13  func acquireDefaultCache() *Cache {
    14  	return &Cache{
    15  		prefix: defaultPrefix,
    16  		qps:    NewQps(),
    17  	}
    18  }
    19  
    20  type cacheBuilder struct {
    21  	prefix           string
    22  	redisOptions     RedisConfig
    23  	bigCacheConfig   BigCacheConfig
    24  	freeSize         int
    25  	publishSubscribe PublishSubscribe
    26  	log              logx.Logger
    27  }
    28  
    29  func NewCacheBuilder() *cacheBuilder {
    30  	return &cacheBuilder{}
    31  }
    32  
    33  func (b *cacheBuilder) WithLogger(log logx.Logger) *cacheBuilder {
    34  	b.log = log
    35  	return b
    36  }
    37  
    38  func (b *cacheBuilder) WithPrefix(prefix string) *cacheBuilder {
    39  	b.prefix = prefix
    40  	return b
    41  }
    42  
    43  func (b *cacheBuilder) WithRedis(opts RedisConfig) *cacheBuilder {
    44  	b.redisOptions = opts
    45  	return b
    46  }
    47  
    48  func (b *cacheBuilder) WithBigCache(opts BigCacheConfig) *cacheBuilder {
    49  	b.bigCacheConfig = opts
    50  	return b
    51  }
    52  
    53  func (b *cacheBuilder) WithFreeCache(size int) *cacheBuilder {
    54  	b.freeSize = size
    55  	return b
    56  }
    57  
    58  // 使用自定义分布式缓存
    59  func WithDistributedCache(c DistributdCache) {
    60  
    61  }
    62  
    63  func (b *cacheBuilder) WithPublishSubscribe(p PublishSubscribe) *cacheBuilder {
    64  	b.publishSubscribe = p
    65  	return b
    66  }
    67  
    68  func (b cacheBuilder) Build() (*Cache, error) {
    69  	var err error
    70  	cache := acquireDefaultCache()
    71  	if len(b.prefix) > 0 {
    72  		cache.prefix = b.prefix
    73  	}
    74  
    75  	b.redisOptions.Prefix = cache.prefix
    76  
    77  	redis := NewRedis(b.redisOptions)
    78  	if err := redis.Ping(); err != nil {
    79  		return cache, err
    80  	}
    81  
    82  	var mem MemCache
    83  	if b.freeSize > 0 {
    84  		mem = NewFreeCache(b.freeSize)
    85  	} else {
    86  		if b.log != nil {
    87  			b.bigCacheConfig.log = b.log
    88  		}
    89  
    90  		mem, err = NewBigCache(b.bigCacheConfig)
    91  	}
    92  
    93  	cache.distributdCache = redis
    94  	cache.mem = mem
    95  	cache.publishSubscribe = b.publishSubscribe
    96  	cache.logger = b.log
    97  
    98  	return cache, err
    99  }