繁体   English   中英

Appengine之上的键值

[英]Key-Value on top of Appengine

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

使用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数据存储区,必须将字符串“键”和“值”作为要存储的实体。

喜欢:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM