我正在使用 Redis 为我的 Go 简单 Web 应用程序存储 session 。 为此,我只想让一个 session 一次访问 redis 连接。 我搜索了有关在 Go 中实现单例对象的信息并进行了跟踪。 这是我目前正在实现的代码:
Redis连接:
package Datab
import (
"github.com/gomodule/redigo/redis"
)
type cache struct {
Conn redis.Conn
}
var singleCache *cache = nil
func GetSessionCache() *cache {
if singleCache == nil {
singleCache := &cache{}
singleCache.Conn, _ = redis.DialURL("redis://localhost")
// ^ SINGLECACHE IS NOT NIL HERE.
}
return singleCache
// ^ SAYS THIS IS NIL!
}
Redis 实现:
package Handler
import (
Datab "videodoox/DB" // this file contains the redis connection implementation
)
connStru := *Datab.GetSessionCache()
cache := connStru.Conn
connStru2 := *Datab.GetSessionCache()
cache2: = connStru.Conn
// ^ THIS CONNECTION HERE IS A COMPLETELY NEW INSTANCE.
每次我获得连接时,redis 连接文件都会创建一个新的连接实例。 如何创建一次新连接并每次都返回该连接? 谢谢!
最佳答案
对最初问题的评论解决了问题,但只是为了提供完整的解决方案,您的代码可能如下所示:
package Datab
import (
"sync"
"github.com/gomodule/redigo/redis"
)
type cache struct {
Conn redis.Conn
}
var singleCache *cache
var initOnce sync.Once
func GetSessionCache() *cache {
initOnce.Do(func() {
singleCache := &cache{}
singleCache.Conn, _ = redis.DialURL("redis://localhost")
})
return singleCache
}
只是一些额外的注释:
- 无需指定
nil
作为指针的初始值,它们的零值默认为nil
(var singleCache *cache
vsvar singleCache *cache = nil
). - 您应该处理
redis.DialURL
返回的潜在错误,而不仅仅是使用_
跳过它。
关于go - 单例实例不断在 Go 中创建新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55292469/