46 lines
960 B
Go
46 lines
960 B
Go
package redis
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/gomodule/redigo/redis"
|
|
"qoobing.com/gomod/redis/sentinel"
|
|
)
|
|
|
|
func newSentinelPool() *redis.Pool {
|
|
sntnl := &sentinel.Sentinel{
|
|
Addrs: []string{":26379", ":26380", ":26381"},
|
|
MasterName: "mymaster",
|
|
Dial: func(addr string) (redis.Conn, error) {
|
|
timeout := 500 * time.Millisecond
|
|
c, err := redis.DialTimeout("tcp", addr, timeout, timeout, timeout)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return c, nil
|
|
},
|
|
}
|
|
return &redis.Pool{
|
|
MaxIdle: 3,
|
|
MaxActive: 64,
|
|
Wait: true,
|
|
IdleTimeout: 240 * time.Second,
|
|
Dial: func() (redis.Conn, error) {
|
|
masterAddr, err := sntnl.MasterAddr()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
c, err := redis.Dial("tcp", masterAddr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if !sentinel.TestRole(c, "master") {
|
|
c.Close()
|
|
return nil, fmt.Errorf("%s is not redis master", masterAddr)
|
|
}
|
|
return c, nil
|
|
},
|
|
}
|
|
}
|