【发布时间】:2015-12-09 22:49:19
【问题描述】:
我正在使用以下代码从我的 Go 应用程序中执行 SET 和 EXPIRE。
_, err = C.Cache.Do("SETEX", key, 3600, data)
但我开始遇到错误:使用关闭的网络连接。我使用 Gary Burd 的 Redigo 包和 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
}
【问题讨论】:
-
如果您收到有关关闭连接的错误,您需要重新连接到数据库。不应该与 SETEX 命令有任何关系(顺便说一下,在较新的版本中通过使用带有选项的 SET 来取代它)
-
我已经添加了我的代码来展示我如何管理 Redis 连接 - 它有任何明显的问题吗?感谢您提供有关 SET(带选项)命令的信息。
-
我无法从代码中断章取义地判断延迟将发生在哪里,但您应该保持连接并尽可能重用它们。通常你想要一个
redis.Pool。也可以在这里查看我的答案:stackoverflow.com/questions/30244080/… -
太棒了 - 我不确定什么时候需要一个游泳池,但我想是现在。
-
如果@JimB 的回答不起作用,则使用race detector 运行应用程序并阅读Redigo 文档regarding concurrency。