Singleton实例继续在Go中创建新实例

时间:2019-03-22 03:26:22

标签: go redis

我正在使用Redis为我的Go简单网络应用存储会话。 为此,我只希望单个会话一次访问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连接文件都会创建一个新的连接实例。 如何创建一次新连接,然后每次都返回该连接? 谢谢!

1 个答案:

答案 0 :(得分:0)

对第一个问题的评论解决了该问题,但仅是为了提供完整的解决方案,您的代码应如下所示:

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指定为指针的初始值,默认情况下它们的零值为nilvar singleCache *cachevar singleCache *cache = nil)。
  • 您应该处理redis.DialURL返回的潜在错误,而不仅仅是使用_跳过它。