当前位置: 首页 > 知识库问答 >
问题:

在Golang中获取不同包中的Redis变量

方楷
2023-03-14

我正在使用go-redis/redis和go-redis/cache来缓存Go对象。

import (
    "communication/MQ_pkg"

    "gopkg.in/go-redis/cache.v3"
    "gopkg.in/vmihailenco/msgpack.v2"
)

obj := &VAR_STRUCT{}        

Codec.Set(&cache.Item{
            Key:    key,
            Object: obj,
        })

其中obj是一个具有go映射(键值对)的结构,通过使用上面的代码,我正在设置一个键并将值保存到其中。这是package Common。现在我想在不同的包中访问它,比如GetRedis_pkg,而不导入pkg。我有什么办法可以做到。并且我可以通过任何方式访问该结构内部的特定映射吗?使用redis key imorted gopkg.in/go-redis/cache.v3在我的代码中使用redis

共有1个答案

贺英悟
2023-03-14

是的,您可以通过对两个包以及set和get操作使用公共的codec实例来访问相同的映射。为此,您需要实现一个单例实例生成器。理想的情况是,它应该是一个线程安全的实现。这样,您将节省大量的资源,并保证连接的正确性。这对于使客户机成为防止bug和节省资源的唯一用户是很重要的。

Client是一个Redis Client,表示一个由零个或多个基础连接组成的池。它对于多个goroutines并发使用是安全的。

package singleton

import (                       
    "sync"                     
    "gopkg.in/go-redis/cache.v5"
    "gopkg.in/redis.v5"
)                                                            

var codec *cache.Codec        
var once sync.Once             

func GetInstance() *cache.Codec {
    once.Do(func() {           
        client := redis.NewClient(&redis.Options{
            Addr:     "localhost:6379",
            Password: "", // no password set
            DB:       0,  // use default DB
        })

        codec = &cache.Codec{
            Redis: client,

            Marshal: func(v interface{}) ([]byte, error) {
                return msgpack.Marshal(v)
            },
            Unmarshal: func(b []byte, v interface{}) error {
                return msgpack.Unmarshal(b, v)
            },
        }
    })                         
    return codec            
}        
package setter                           

import (                                         
    "github.com/Me/myapp/singleton"  
    "sync"                              
)                                       

func Set(keys []string, vals []SomeObj, wg *sync.WaitGroup){
    for i, k := range keys {            
        wg.Add(1)
        // singleton is thread safe and could be used with goroutines                       
        go func() {                     
            codec := single.GetInstance()

            codec.Set(&cache.Item{
                Key:        k,
                Object:     vals[i],
                Expiration: time.Hour,
            })
            wg.Done()                   
        }()                             
    }                                   
}                                       
package getter                           

import (                                         
    "github.com/Me/myapp/singleton"  
    "sync"                              
)                                       

func Set(keys []string, wg *sync.WaitGroup) chan SomeObj {
    wanted_objs := make(chan *SomeObj)
    for i, k := range keys {            
        wg.Add(1)
        // singleton is thread safe and could be used with goroutines                       
        go func() {                     
            codec := singleton.GetInstance()
            wanted := new(SomeObj)
            if err := codec.Get(key, wanted); err == nil {
                wanted_objs <- wanted
            }
        }()
    }
    return wanted_objs
}
 类似资料:
  • 问题内容: 可以在Golang中定义一个不变的结构吗?一旦初始化,则只能对struct的字段进行读取操作,而无需修改字段值。如果是这样,该怎么做。 问题答案: 通过使其成员不导出并提供阅读器,可以在其程序包外部将结构设为只读。例如: 和用法:

  • 问题内容: 这是我的配置: 回波用于测试。我隐藏了IP。 我正在尝试通过NGiNX从Redis获取会话数据。这就是为什么我安装HttpRedis的原因。 我不了解的是如何从Redis获取数据,然后将其放入变量中。所以我可以随便使用它。 问题答案: 使用NGiNX-Eval-Module:https : //github.com/vkholodkov/nginx-eval- module 这是您的操

  • 问题内容: 阅读部分不是并发的,但处理是并发的。我用这种方式来命名标题,因为我最有可能使用该短语再次搜索此问题。:) 尝试 超越示例 之后,我陷入僵局,因此这对我来说是一种学习经验。我的目标是: 逐行读取文件(最终使用缓冲区执行多行)。 将文本传递给执行某些正则表达式的工作。 将结果发送到某个地方,但要避免使用互斥或​​共享变量。我正在将整数(总是数字1)发送到通道。这有点愚蠢,但是如果不引起问题

  • 下面我有两个箱子。 案例1和案例2之间的区别在于案例2具有在中,但案例1在中具有。 问题是关于案例2的输出:为什么包含两个不同的值,一个是,另一个是字符串“B”?

  • 问题内容: 我有一个Main应用程序和多个工作程序节点,它们在领事中注册。我想通过负载平衡将数据发送到工作节点。使用congo的golang API,我可以在主应用程序上获得可用的服务。 但是,我无法在golang应用程序中获取DNS SRV记录。 如该线程中所述,如何在go应用程序中读取领事SRV记录?,我尝试了github.com/miekg/dns,但没有成功。另外,我尝试使用github.

  • 问题内容: 我有主软件包(main.go): 我还有另一个包(index.go): 如何从另一个包中获取会话值?还是应该将其传递给我的处理程序(如果是,该怎么做?)。 我是Golang的新手。请帮忙。 问题答案: 我通常将依赖项包装在自己的程序包中,这让我抽象了一些我做的常见事情。对于会话,我通常大部分时间都使用相同的会话名称,因此通常会有以下内容: 然后您可以在其他任何地方导入自己的会话包: 更