Appengine之上的关键价值

时间:2012-06-18 18:02:28

标签: java google-app-engine datanucleus

尽管appengine已经是无模式的,但仍需要定义需要通过Datastore持久层存储到Datanucleus的实体。所以我在考虑解决这个问题的方法;通过具有将在运行时存储键值的层,而不是编译时实体。

使用Redis完成此操作的方法是创建一个这样的键:

private static final String USER_ID_FORMAT = "user:id:%s";
private static final String USER_NAME_FORMAT = "user:name:%s";

来自文档的Redis类型包括:StringLinked-listSetSorted set。我不确定是否还有更多。

对于GAE数据存储区而言,字符串“Key”和“Value”必须是将要存储的实体。

像:

public class KeyValue {
 private String key;
 private Value value; // value can be a String, Linked-list, Set or Sorted set etc.
 // Code omitted
}

此方案的正当理由源于对数据存储区的Restful访问(由Datanucleus-api-rest提供)

使用此rest api来持久保存对象或实体:

POST http://datanucleus.appspot.com/dn/guestbook.Greeting
{"author":null,
  "class":"guestbook.Greeting",
  "content":"test insert",
  "date":1239213923232}

这种方法的问题在于,为了持久化实体,需要在编译时定义实际的类;与拥有键值存储机制的想法不同,我们可以简化方法调用:

POST http://datanucleus.appspot.com/dn/org.myframework.KeyValue
{ "class":"org.myframework.KeyValue"
  "key":"user:id:johnsmith;followers",
  "value":"the_list",
}

将单个字符串作为“值”传递相当容易,我可以将JSON数组用于列表,集合或排序列表。真正的问题是如何实际持久传递到界面中的不同类型的数据。应该有多个KeyValue实体,每个实体代表它支持的基本类型:KeyValueString? KeyValueList?等

3 个答案:

答案 0 :(得分:1)

看起来您正在使用基于JSON的REST API,那么为什么不将Value存储为JSON字符串呢?

答案 1 :(得分:1)

您不需要使用Datanucleus图层或任何其他精细ORM图层(如Twig或Objectify)。这些是可选的,都是基于低级API。如果我正确地解释你说的话,也许它已经拥有了你想要的功能。请参阅:https://developers.google.com/appengine/docs/java/datastore/entities

答案 2 :(得分:1)

Datanucleus是一个在GAE之上运行的特定框架。但是,您可以在较低级别,结构较少,类似键/值的级别(低级API)访问数据库。这是您可以直接访问的最低级别。 BTW,低级别的“GAE数据存储”内部运行在6个全球Google Megastore表上,而这些表又由Google Big Table数据库系统托管。 将JSON保存为字符串工作正常。但是除了ID之外,您还需要检索对象的方法。也就是说,您需要一种方法来索引数据,以支持任何类型的有用查询。