go - 单例实例不断在 Go 中创建新实例

标签 go redis

我正在使用 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 vs var singleCache *cache = nil).
  • 您应该处理 redis.DialURL 返回的潜在错误,而不仅仅是使用 _ 跳过它。

关于go - 单例实例不断在 Go 中创建新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55292469/

相关文章:

go - 在不重叠的情况下在矩形上获取随机坐标

mongodb - 如何在Mongo中找到最新索引

json - 在golang中编辑继承属性的标签?

linux - Go:在 exec.Command 中使用字符串时出现奇怪的结果

performance - nodejs http 和 redis,只有 6000req/s

spring-boot - Sails JS 和 Spring Boot 之间的共享 session

go - 用于寻路的 mgo 优化

redis - 在 CentOS 7 中使用 ansible 从 iptables 迁移到 firewalld 设置

ruby-on-rails - Redis 不断调用 localhost :6379 even though deployed to Heroku

ruby - Redis 是否会为大量请求对 hset 命令进行排队?