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

时间:2016-12-30 07:42:39

标签: caching go redis

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

1 个答案:

答案 0 :(得分:1)

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

  

客户端是表示零个或多个底层连接池的Redis客户端。多个goroutine可以安全地同时使用。

Singleton编解码器

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
}