我正在使用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贴图的结构(键值对) 通过使用上面的代码我设置一个键并将值保存到其中。这是常见的。 现在我想在不同的软件包中使用GetRedis_pkg来访问它而不导入pkg。我有什么方法可以做到这一点。 我可以使用redis键以任何方式访问该结构内的特定地图 imorted gopkg.in/go-redis/cache.v3在我的代码中使用redis
答案 0 :(得分:1)
是的,您可以通过对两个软件包以及set和get操作使用公共Codec
实例来访问同一个映射。为此,您需要实现单例实例生成器。理想地,它应该是线程安全的实现。这样,您将节省大量资源并保证连接的正确性。这对于保持客户端仅用于防止错误和节省资源非常重要。
客户端是表示零个或多个底层连接池的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
}