Datastore
虽然 appengine 已经是无模式的,但仍然需要通过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?键值列表?等等