我一直在使用 Google App Engine Go SDK 开发几个应用程序,它们使用 Memcache 作为从 Datastore 加载数据的缓冲区。由于 Memcache 只能以[]byte
. 不用说,当我需要重复做这种事情 5 次时,这是相当乏味的。
是否有一种简单的方法可以将可以存储在 Datastore 中的任意结构转换为[]byte
以便将其存储在 Memcache 中,然后将其加载回来,而无需为 GAE Golang 中的各种结构创建自定义代码?
我一直在使用 Google App Engine Go SDK 开发几个应用程序,它们使用 Memcache 作为从 Datastore 加载数据的缓冲区。由于 Memcache 只能以[]byte
. 不用说,当我需要重复做这种事情 5 次时,这是相当乏味的。
是否有一种简单的方法可以将可以存储在 Datastore 中的任意结构转换为[]byte
以便将其存储在 Memcache 中,然后将其加载回来,而无需为 GAE Golang 中的各种结构创建自定义代码?
http://golang.org/pkg/encoding/gob或http://golang.org/pkg/encoding/json可以将任意数据类型转换为 []byte 切片,因为某些规则适用于被编码的数据结构。您可能希望其中一个 gob 将编码为更小的尺寸,但如果需要,json 更容易与其他语言共享。
我发现自己也需要同样的东西。所以我创建了一个名为:
go get github.com/scotch/aego/ds
它使用与它相同的 API,"appengine/datastore"
因此它可以作为替代品使用。
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
的s和Get
s到memcache,但是你可以通过调用方法来修改这个行为ds.Register
:
ds.Register("User", true, false, false)
该方法接受一个表示和 3 - , ,Register
的字符串。传递一个值将导致将记录保存到该存储。该存储对于您不希望更改的记录很有用,但如果您运行的实例不止一个,则可能包含陈旧数据。Kind
bool
userDatastore
useMemcache
useMemory
true
AEgo/ds
Memory
支持的方法有:
Put
PutMulti
Get
GetMulti
Delete
DeleteMulti
AllocateIDs
注意:目前兑现仅发生在Get
. GetMulti
从数据存储中提取。
AEGo/ds
是一项正在进行的工作,但代码已经过很好的测试。对于任何反馈,我们都表示感谢。
为了回答您的问题,这里是我如何将实体序列化为 gob以实现 memcache 持久性。