Go SETEX错误-“;“使用封闭网络连接”;

Go SETEX错误-“;“使用封闭网络连接”;,go,redis,Go,Redis,我正在使用以下代码执行一个集合并从我的Go应用程序中过期 _, err = C.Cache.Do("SETEX", key, 3600, data) 但我开始遇到一个错误:使用封闭网络连接。我使用Gary Burd的软件包和RedisLabs 我连接到Redis的代码是: //Connect to cache (Redis) cache, err := connectToCache() if err != nil { log.Printf("Cache connection setti

我正在使用以下代码执行一个集合并从我的Go应用程序中过期

_, err = C.Cache.Do("SETEX", key, 3600, data)
但我开始遇到一个错误:使用封闭网络连接。我使用Gary Burd的软件包和RedisLabs

我连接到Redis的代码是:

//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
}
您可以使用管理多个连接,检查空闲连接是否处于活动状态,以及自动获取新连接。您也可以在拨打新连接时自动执行验证步骤:

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)
    ...
}

如果在关闭连接时出现错误,则需要重新连接到数据库。不应该与SETEX命令有任何关系(顺便说一句,在较新的版本中使用setwithoptions取代了SETEX命令),我添加了代码来展示我如何管理Redis连接-它有任何明显的问题吗?感谢您提供有关SET(with options)命令的信息。我无法从上下文之外的代码判断延迟将发生在何处,但您应该保持连接,并尽可能重用它们。通常情况下,你想要一个新的。在这里也可以看到我的答案:很好-我不确定什么时候需要一个池,但我想现在是了。如果@JimB的答案不起作用,那么使用运行应用程序并阅读Redigo文档。因此,正如您在另一个答案中指出的,每次需要新连接时,我都会使用类似于
conn=pool.Get()
,每次需要连接时,都要调用
pool.Get()
,然后调用
conn.Close
将连接返回到池中。我假设可以推迟关闭操作,而且,由于这是我正在制作的API,我是否会在Redis操作本身之前每次点击路由时创建连接?@tommyd456:是,您需要确保呼叫关闭,否则连接将不会返回池中。当需要连接时,从池中获取连接,完成后返回连接。