我一直在使用Google App Engine Go SDK开发一些应用程序,这些应用程序使用Memcache作为缓冲区从数据存储区加载数据。由于Memcache只能将数据存储为[]byte
,我经常发现自己创建函数来将各种结构编码为字符串,并且还可以反转该过程。毋庸置疑,当我需要做5次这样的事情时,这是非常乏味的。
有没有一种简单的方法可以将任何可以存储在数据存储区中的任意结构转换为[]byte
,以便将其存储在Memcache中然后加载回来,而无需为GAE Golang中的各种结构创建自定义代码?
答案 0 :(得分:5)
http://golang.org/pkg/encoding/gob或http://golang.org/pkg/encoding/json可以将任意数据类型转换为[]字节切片。您可能希望其中一个gob编码为较小的大小,但如果需要,json可以更容易地与其他语言共享。
答案 1 :(得分:0)
我发现自己需要同样的东西。所以我创建了一个名为:
的包 go get github.com/scotch/aego/ds
它使用与"appengine/datastore"
相同的API,因此它可以作为替代品使用。
import "github.com/scotch/aego/v1/ds"
u = &User{Name: "Bob"}
key := datastore.NewKey(c, "User", "bob", 0, nil)
key, err := ds.Put(c, key, u)
u = new(User)
err = ds.Get(c, key, u)
默认情况下,它会将所有Put
和Get
缓存到memcache,但您可以通过调用ds.Register
方法来修改此行为:
ds.Register("User", true, false, false)
Register
方法采用表示Kind
和3 bool
- userDatastore
,useMemcache
,useMemory
的字符串。传递true
值将导致AEgo/ds
将记录保留到该商店。 Memory
存储对于您不希望更改的记录很有用,但如果您有多个实例正在运行,则可能包含过时数据。
支持的方法是:
Put
PutMulti
Get
GetMulti
Delete
DeleteMulti
AllocateIDs
注意:目前仅兑现Get
。 GetMulti
来自数据存储区。
AEGo/ds
正在进行中,但代码已经过充分测试。对于任何反馈,我们都表示感谢。
在这里回答你的问题是我如何serialized the entities to gob为memcache持久性。