88 "bytes"
99 "encoding/gob"
1010 "fmt"
11+ "runtime"
1112 "strings"
1213 "sync"
1314 "time"
@@ -40,14 +41,25 @@ func (p *Provider) Init(providerName string, appCfg *config.Config, logger log.L
4041 p .appCfg = appCfg
4142 p .logger = logger
4243
43- if strings .ToLower (p .appCfg .StringDefault ("cache." + p .name + ".provider" , "" )) != "redis" {
44+ cfgPrefix := "cache." + p .name + "."
45+ if strings .ToLower (p .appCfg .StringDefault (cfgPrefix + "provider" , "" )) != "redis" {
4446 return fmt .Errorf ("aah/cache: not a vaild provider name, expected 'redis'" )
4547 }
4648
4749 p .clientOpts = & redis.Options {
48- Addr : p .appCfg .StringDefault ("cache." + p .name + ".address" , ":6379" ),
49- Password : p .appCfg .StringDefault ("cache." + p .name + ".password" , "" ),
50- DB : p .appCfg .IntDefault ("cache." + p .name + ".db" , 0 ),
50+ Network : p .appCfg .StringDefault (cfgPrefix + "network" , "tcp" ),
51+ Addr : p .appCfg .StringDefault (cfgPrefix + "address" , ":6379" ),
52+ Password : p .appCfg .StringDefault (cfgPrefix + "password" , "" ),
53+ DB : p .appCfg .IntDefault (cfgPrefix + "db" , 0 ),
54+ PoolSize : p .appCfg .IntDefault (cfgPrefix + "pool_size" , 10 * runtime .NumCPU ()),
55+ DialTimeout : parseDuration (p .appCfg .StringDefault (cfgPrefix + "timeout.connect" , "5s" ), "5s" ),
56+ ReadTimeout : parseDuration (p .appCfg .StringDefault (cfgPrefix + "timeout.read" , "3s" ), "3s" ),
57+ WriteTimeout : parseDuration (p .appCfg .StringDefault (cfgPrefix + "timeout.write" , "3s" ), "3s" ),
58+ PoolTimeout : parseDuration (p .appCfg .StringDefault (cfgPrefix + "timeout.pool" , "3s" ), "3s" ),
59+ IdleTimeout : parseDuration (p .appCfg .StringDefault (cfgPrefix + "timeout.idle" , "5m" ), "5m" ),
60+ IdleCheckFrequency : parseDuration (p .appCfg .StringDefault (cfgPrefix + "idle_check_interval" , "1m" ), "1m" ),
61+ MinRetryBackoff : parseDuration (p .appCfg .StringDefault (cfgPrefix + "retry_backoff.min" , "8ms" ), "8ms" ),
62+ MaxRetryBackoff : parseDuration (p .appCfg .StringDefault (cfgPrefix + "retry_backoff.max" , "512ms" ), "512ms" ),
5163 }
5264
5365 p .client = redis .NewClient (p .clientOpts )
@@ -71,6 +83,12 @@ func (p *Provider) Create(cfg *cache.Config) (cache.Cache, error) {
7183 return r , nil
7284}
7385
86+ // Client method returns underlying redis client. So that aah user could perform
87+ // cache provider specific features.
88+ func (p * Provider ) Client () * redis.Client {
89+ return p .client
90+ }
91+
7492//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
7593// redisCache struct implements `cache.Cache` interface.
7694//______________________________________________________________________________
@@ -171,3 +189,11 @@ func releaseBuffer(b *bytes.Buffer) {
171189 bufPool .Put (b )
172190 }
173191}
192+
193+ func parseDuration (v , f string ) time.Duration {
194+ if d , err := time .ParseDuration (v ); err == nil {
195+ return d
196+ }
197+ d , _ := time .ParseDuration (f )
198+ return d
199+ }
0 commit comments