![](/img/trans.png)
[英]How to store Key-Value pairs using JDO (datanucleus & appengine)
[英]Key-Value on top of Appengine
尽管appengine已经没有模式,但是仍然需要定义需要通过Datanucleus
持久层存储到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数据存储区,必须将字符串“键”和“值”作为要存储的实体。
喜欢:
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}
这种方法的问题在于,为了持久化Entity,需要在编译时定义实际的类; 与具有键值存储机制的想法不同,我们可以简化方法调用:
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? 等等
看起来您正在使用基于JSON的REST API,那么为什么不只将Value存储为JSON字符串呢?
您无需使用Datanucleus层或任何其他精细的ORM层(例如Twig或Objectify)。 这些是可选的,并且都基于低级API。 如果我能正确解释您的意思,也许它已经具有您想要的功能。 请参阅: https : //developers.google.com/appengine/docs/java/datastore/entities
Datanucleus是在GAE之上运行的特定框架。 但是,您可以在较低的,结构较少的,更像键/值的级别(低级API)中访问数据库。 这是您可以直接访问的最低级别。 顺便说一句,底层的“ GAE数据存储”在内部运行在6个全局Google Megastore表上,这些表又托管在Google Big Table数据库系统上。 将JSON保存为字符串可以正常工作。 但是,除了ID之外,您还需要其他方法来检索对象。 也就是说,您需要一种对数据进行索引的方法,以支持对其进行任何有用的查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.