【问题标题】:Get Redis variable in different package in Golang在 Golang 的不同包中获取 Redis 变量
【发布时间】:2016-12-30 07:42:38
【问题描述】:

我正在使用 go-redis/redisgo-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 maps(键值对)的结构 通过使用上面的代码,我正在设置一个键并将值保存到其中。这在包中很常见。 现在我想在不同的包中访问它,比如 GetRedis_pkg 而不导入 pkg。有什么办法我可以做到这一点。 我可以使用 redis 键以任何方式访问该结构内的特定地图吗 imorted gopkg.in/go-redis/cache.v3 在我的代码中使用redis

【问题讨论】:

    标签: caching go redis


    【解决方案1】:

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

    Client 是一个 Redis 客户端,代表零个或多个底层连接池。多个 goroutine 并发使用是安全的。

    单一编解码器

    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
    }
    

    【讨论】:

    • 我已导入 gopkg.in/go-redis/cache.v3 以在我的代码中使用 redis
    • 好的,在您的问题中描述您使用的工具并设置适当的标签。
    • 是的,我可以,我会再改进一次。不要将 Go 代码包装到这个 html/js 包装器中。
    • @vkc,Go 不直接使用线程,请参阅我关于 goroutines 的回答 stackoverflow.com/a/41047899/629685。是的,这个实现是线程安全的。
    • @vkc,如果答案对你有用,请接受。
    猜你喜欢
    • 2019-09-11
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    相关资源
    最近更新 更多