Singleton实例继续在Go中创建新实例
我正在使用redis为我的Go simple web应用程序存储会话。 为此,我一次只需要一个会话来访问redis连接。 我在Go中搜索实现singleton对象,并进行了跟踪。 这是我目前正在实施的代码: Redis连接: Redis实现: 每次我获得连接时,redis连接文件都会创建一个新的连接实例。 如何创建一次新连接,然后每次都返回该连接?Singleton实例继续在Go中创建新实例,go,redis,Go,Redis,我正在使用redis为我的Go simple web应用程序存储会话。 为此,我一次只需要一个会话来访问redis连接。 我在Go中搜索实现singleton对象,并进行了跟踪。 这是我目前正在实施的代码: Redis连接: Redis实现: 每次我获得连接时,redis连接文件都会创建一个新的连接实例。 如何创建一次新连接,然后每次都返回该连接? 谢谢 对初始问题的注释可以解决问题,但为了提供完整的解决方案,您的代码可以如下所示: package Datab import ( "sy
谢谢 对初始问题的注释可以解决问题,但为了提供完整的解决方案,您的代码可以如下所示:
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 vs var singleCache*cache=nil。
您应该处理redis.DialURL返回的潜在错误,而不仅仅是用3;跳过它。
singleCache:=&cache{}=>这是一个简短的变量声明,它创建了一个新的局部变量,覆盖了全局变量。使用赋值:singleCache=&cache{}。同时,这对于并发使用也是不安全的。最好是在包init函数中初始化singleCache或使用一次。如果需要延迟初始化,请执行该操作。@icza哦,该死的,我太笨了!那很有魅力!谢谢。是的,我计划使用互斥锁来锁定我的线程并使其线程安全。请注意Redigo。您需要使用互斥来控制对连接方法的访问,或者将缓存字段更改为池。请尝试使用该选项
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.
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
}