尽管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类型包括:String
,Linked-list
,Set
,Sorted 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?等
答案 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之外,您还需要检索对象的方法。也就是说,您需要一种方法来索引数据,以支持任何类型的有用查询。