9

私は、データストアからデータを読み込むためのバッファーとしてMemcacheを使用するGoogle App EngineGoSDKを使用していくつかのアプリを開発してきました。Memcacheはデータをとしてしか保存できない[]byteため、さまざまな構造を文字列としてエンコードする関数や、プロセスを逆にする関数を作成することがよくあります。言うまでもなく、このようなことを5回以上行う必要がある場合は非常に面倒です。

データストアに保存できる任意の構造を変換し[]byteてMemcacheに保存し、GAE Golangでさまざまな構造のカスタムコードを作成せずにロードし直す簡単な方法はありますか?

4

2 に答える 2

6

http://golang.org/pkg/encoding/gobまたはhttp://golang.org/pkg/encoding/jsonは、エンコードされるデータ構造に特定のルールが適用される場合、任意のデータ型を []byte スライスに変換できます。そのうちの 1 つが 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の とが memcache にキャッシュされますが、次のメソッドGetを呼び出すことでこの動作を変更できます。ds.Register

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

このメソッドは、および 3 - , ,をRegister表す文字列を取ります。値を渡すと、レコードがそのストアに永続化されます。ストアは、変更する予定のないレコードに役立ちますが、複数のインスタンスを実行している場合は古いデータが含まれる可能性があります。KindbooluserDatastoreuseMemcacheuseMemorytrueAEgo/dsMemory

サポートされている方法は次のとおりです。

Put
PutMulti
Get
GetMulti
Delete
DeleteMulti
AllocateIDs

注: 現在、キャッシュは でのみ発生しGetます。GetMultiデータストアからプルします。

AEGo/ds進行中の作業ですが、コードは十分にテストされています。フィードバックをいただければ幸いです。

そして、あなたの質問に答えるために、エンティティをシリアル化して memcache の永続性を取得する方法を次に示します。

于 2012-07-11T20:11:26.830 に答える