9

我一直在使用 Google App Engine Go SDK 开发几个应用程序,它们使用 Memcache 作为从 Datastore 加载数据的缓冲区。由于 Memcache 只能以[]byte. 不用说,当我需要重复做这种事情 5 次时,这是相当乏味的。

是否有一种简单的方法可以将可以存储在 Datastore 中的任意结构转换为[]byte以便将其存储在 Memcache 中,然后将其加载回来,而无需为 GAE Golang 中的各种结构创建自定义代码?

4

2 回答 2

6

http://golang.org/pkg/encoding/gobhttp://golang.org/pkg/encoding/json可以将任意数据类型转换为 []byte 切片,因为某些规则适用于被编码的数据结构。您可能希望其中一个 gob 将编码为更小的尺寸,但如果需要,json 更容易与其他语言共享。

于 2012-07-10T19:47:17.033 回答
0

我发现自己也需要同样的东西。所以我创建了一个名为:

AEGo/ds

文档| 来源

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和Gets到memcache,但是你可以通过调用方法来修改这个行为ds.Register

ds.Register("User", true, false, false)

该方法接受一个表示和 3 - , ,Register的字符串。传递一个值将导致将记录保存到该存储。该存储对于您不希望更改的记录很有用,但如果您运行的实例不止一个,则可能包含陈旧数据。KindbooluserDatastoreuseMemcacheuseMemorytrueAEgo/dsMemory

支持的方法有:

Put
PutMulti
Get
GetMulti
Delete
DeleteMulti
AllocateIDs

注意:目前兑现仅发生在Get. GetMulti从数据存储中提取。

AEGo/ds是一项正在进行的工作,但代码已经过很好的测试。对于任何反馈,我们都表示感谢。

为了回答您的问题,这里是我如何将实体序列化为 gob以实现 memcache 持久性。

于 2012-07-11T20:11:26.830 回答