SETEX错误 – “使用已关闭的网络连接”

huangapple go评论78阅读模式
英文:

SETEX error - "Use of closed network connection"

问题

我正在使用以下代码在我的Go应用程序中执行SET和EXPIRE操作。

_, err = C.Cache.Do("SETEX", key, 3600, data)

但是我开始遇到一个错误:使用已关闭的网络连接。我使用Gary Burd的Redigo包和RedisLabs。

我连接到Redis的代码如下:

//连接到缓存(Redis)
cache, err := connectToCache()
if err != nil {
    log.Printf("缓存连接设置无效")
    os.Exit(1)
}
defer cache.Close()

func connectToCache() (redis.Conn, error) {
    cache, err := redis.Dial("tcp", CACHE_URI)
    if err != nil {
        return nil, err
    }
    _, err = cache.Do("AUTH", CACHE_AUTH)
    if err != nil {
        cache.Close()
        return nil, err
    }
    return cache, nil
}
英文:

I'm using the following code to execute a SET and EXPIRE from my Go app.

_, err = C.Cache.Do("SETEX", key, 3600, data)

but I've started to get an error: Use of closed network connection. I use Gary Burd's Redigo package and RedisLabs.

My code to connect to Redis is:

//Connect to cache (Redis)
cache, err := connectToCache()
if err != nil {
	log.Printf("Cache connection settings are invalid")
	os.Exit(1)
}
defer cache.Close()

func connectToCache() (redis.Conn, error) {
	cache, err := redis.Dial("tcp", CACHE_URI)
	if err != nil {
		return nil, err
	}
	_, err = cache.Do("AUTH", CACHE_AUTH)
	if err != nil {
		cache.Close()
		return nil, err
	}
	return cache, nil
}

答案1

得分: 9

你可以使用redis.Pool来管理多个连接,检查空闲连接是否存活,并自动获取新的连接。在拨号新连接时,你还可以自动执行AUTH步骤:

func newPool(server, password string) *redis.Pool {
    return &redis.Pool{
        MaxIdle:     3,
        IdleTimeout: 240 * time.Second,
        Dial: func() (redis.Conn, error) {
            c, err := redis.Dial("tcp", server)
            if err != nil {
                return nil, err
            }
            if _, err := c.Do("AUTH", password); err != nil {
                c.Close()
                return nil, err
            }
            return c, err
        },
        TestOnBorrow: func(c redis.Conn, t time.Time) error {
            _, err := c.Do("PING")
            return err
        },
    }
}

var (
    pool          *redis.Pool
    redisServer   = flag.String("redisServer", ":6379", "")
    redisPassword = flag.String("redisPassword", "", "")
)

func main() {
    flag.Parse()
    pool = newPool(*redisServer, *redisPassword)
    ...
}
英文:

You can use a redis.Pool to manage multiple connections, check that idle connections are alive, and get new connections automatically. You can also do the AUTH step automatically when dialing a new connection:

func newPool(server, password string) *redis.Pool {
    return &redis.Pool{
        MaxIdle: 3,
        IdleTimeout: 240 * time.Second,
        Dial: func () (redis.Conn, error) {
            c, err := redis.Dial("tcp", server)
            if err != nil {
                return nil, err
            }
            if _, err := c.Do("AUTH", password); err != nil {
                c.Close()
                return nil, err
            }
            return c, err
        },
        TestOnBorrow: func(c redis.Conn, t time.Time) error {
            _, err := c.Do("PING")
            return err
        },
    }
}

var (
    pool *redis.Pool
    redisServer = flag.String("redisServer", ":6379", "")
    redisPassword = flag.String("redisPassword", "", "")
)

func main() {
    flag.Parse()
    pool = newPool(*redisServer, *redisPassword)
    ...
}

huangapple
  • 本文由 发表于 2015年12月9日 22:09:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/34180858.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定