我有一个应用程序每秒对 redis 进行大约 400 次读取和每秒 100 次写入(托管在 redislabs 上)。该应用程序使用github.com/garyburd/redigo包作为 redis 代理。
我有两个函数,它们是唯一用于读写的函数:
func getCachedVPAIDConfig(key string) chan *cachedVPAIDConfig {
c := make(chan *cachedVPAIDConfig)
go func() {
p := pool.Get()
defer p.Close()
switch p.Err() {
case nil:
item, err := redis.Bytes(p.Do("GET", key))
if err != nil {
c <- &cachedVPAIDConfig{nil, err}
return
}
c <- &cachedVPAIDConfig{item, nil}
default:
c <- &cachedVPAIDConfig{nil, p.Err()}
return
}
}()
return c
}
func setCachedVPAIDConfig(key string, j []byte) chan error {
c := make(chan error)
go func() {
p := pool.Get()
defer p.Close()
switch p.Err() {
case nil:
_, err := p.Do("SET", key, j)
if err != nil {
c <- err
return
}
c <- nil
default:
c <- p.Err()
return
}
}()
return c
}
如您所见,我正在使用推荐的连接池机制(http://godoc.org/github.com/garyburd/redigo/redis#Pool)。
我在应用程序的端点收到的每个 http 请求上调用这些函数。问题是:一旦应用程序开始获取请求,它立即开始抛出错误
dial tcp 54.160.xxx.xx:yyyy: connect: cannot assign requested address
(54.160.xxx.xx:yyyy是redis主机)
我在 redis 上看到,当这种情况开始发生时,只有大约 600 个连接,这听起来并不多。
我尝试使用 的MaxActive设置pool,将其设置在 1000 到 50K 之间的任何位置,但结果是一样的。
有任何想法吗?
扬帆大鱼
相关分类