小编Chr*_*row的帖子

Google App Engine中的非规范化?

背景::::

我正在使用谷歌应用引擎(GAE)进行Java.我正在努力设计一个能够发挥大表优势和劣势的数据模型,这些是之前的两个相关帖子:

我暂时决定在一个完全规范化的主干上,将非规范化属性添加到实体中,这样大多数客户端请求只能用一个查询来处理.

我认为完全规范化的主干将:

  • 如果我在非规范化中编码错误,请帮助维护数据完整性
  • 从客户端的角度启用一次操作中的写入
  • 允许对数据进行任何类型的意外查询(假设有人愿意等待)

而非规范化数据将:

  • 使大多数客户端请求能够非常快速地得到服务

基本非规范化技术:::

我观看了一个app引擎视频,描述了一种被称为"扇出"的技术.我们的想法是快速写入规范化数据,然后使用任务队列完成幕后的非规范化,而无需客户端等待.我已将视频添加到此处以供参考,但它只需一小时,而且无需观看它就能理解这个问题:http: //code.google.com/events/io/2010/sessions/high-throughput -data-管道,appengine.html

如果我使用这种"扇出"技术,每次客户端修改一些数据时,应用程序将在一次快速写入中更新规范化模型,然后将非规范化指令发送到任务队列,这样客户端就不必等待他们也完成了.

问题:::

使用任务队列更新数据的非规范化版本的问题在于,在任务队列完成对该数据的非规范化之前,客户端可以对刚刚修改的数据发出读取请求.这将为客户端提供过时的数据,这些数据与他们最近的请求混淆客户端并使应用程序显得有问题.

作为补救措施,我建议通过URLFetch异步调用应用程序中的其他URL来并行扇出非规范化操作:http://code.google.com/appengine/docs/java/urlfetch/ 应用程序将等到所有在响应客户端请求之前已完成异步调用.

例如,如果我有一个"约会"实体和一个"客户"实体.每个约会将包括其预定的客户信息的非规范化副本.如果客户更改了他们的名字,那么该应用程序将进行30次异步调用; 每个受影响的约会资源一个,以便更改每个客户的名字副本.

从理论上讲,这可以全部并行完成.所有这些信息都可以在大约花费1或2次写入数据存储区所需的时间内更新.在非规范化完成后,可以对客户端做出及时响应,消除客户端暴露于不一致数据的可能性.

我看到的最大的潜在问题是,应用程序在任何时候都不能有超过10个异步请求调用(此处记录):http://code.google.com/appengine/docs/java/urlfetch/overview .html).

建议的非规范化技术(递归异步扇出):::

我提出的补救措施是将非规范化指令发送到另一个资源,该资源递归地将指令拆分成相等大小的较小块,用较小的块作为参数调用自身,直到每个块中的指令数足够小以便完全执行.例如,如果具有30个关联约会的客户更改了其名字的拼写.我将使用指令更新所有30个约会来调用非规范化资源.然后,它将这些指令分成10组3条指令,并使用每组3条指令向其自己的URL发出10个异步请求.一旦指令集小于10,资源就会根据每条指令直接发出异步请求.

我对这种方法的担忧是:

  • 它可以被解释为试图规避app引擎的规则,这会导致问题.(它甚至不允许URL调用自己,所以我实际上必须有两个URL资源来处理相互调用的递归)
  • 它很复杂,有多个潜在的失败点.

我真的很感激这种方法的一些意见.

java google-app-engine database-design bigtable denormalization

13
推荐指数
1
解决办法
1628
查看次数

Python查找不在集合中的数字

我有一系列的数字,如1-100.我有一个包含所有数据的集合,或者该范围内的随机数字子集,例如:

s = set([1,2,3,35,67,87,95])
Run Code Online (Sandbox Code Playgroud)

什么是获得1-100范围内的所有数字的好方法?

python range set

13
推荐指数
4
解决办法
2万
查看次数

将URL分解为其组件

我正在使用javascript,并希望获取我拥有的URL字符串,并将其分解为其组件,如主机,路径和查询参数.

我需要这样做才能获得一个查询参数,它本身就是一个URL,因此在原始URL字符串中编码.

我觉得在Javascript中应该有一个简单的方法来做到这一点.也许看起来像这样:

var what_I_Want = url("http://www.domain.com?queryArg1=somequeryargument").getQueryArgumentValue("queryArg1");
Run Code Online (Sandbox Code Playgroud)

javascript url url-parsing

12
推荐指数
1
解决办法
2万
查看次数

迭代Python中的dict或列表

刚写了一些讨厌的代码,它们迭代在Python dict或者listPython中.我觉得这不是最好的方法.

问题是,为了迭代dict,这是惯例:

for key in dict_object:
    dict_object[key] = 1
Run Code Online (Sandbox Code Playgroud)

但是,如果在列表上执行相同的操作,则按键修改对象属性不起作用:

# Throws an error because the value of key is the property value, not 
#     the list index:

for key in list_object:
    list_object[key] = 1 
Run Code Online (Sandbox Code Playgroud)

我解决这个问题的方法是编写这个讨厌的代码:

if isinstance(obj, dict):
    for key in obj:
        do_loop_contents(obj, key)
elif isinstance(obj, list):
    for i in xrange(0, len(obj)):
        do_loop_contents(obj, i)

def do_loop_contents(obj, key):
    obj[key] = 1
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

谢谢!

python dictionary loops list

12
推荐指数
3
解决办法
1万
查看次数

如何为API客户端提供1,000,000个数据库结果?

跟进我之前的问题:

在PostgreSQL中使用"Cursors"进行分页

为API客户端提供1,000,000个数据库结果的好方法是什么?

我们目前正在使用PostgreSQL.一些建议的方法:

  • 使用游标进行分页
  • 使用随机数进行分页(为每个查询添加"GREATER THAN BYDER BY")
  • 使用LIMIT和OFFSET进行分页(针对非常大的数据集进行分解)
  • 将信息保存到文件中,然后让客户端下载它
  • 迭代结果,然后将数据POST到客户端服务器
  • 仅返回客户端的密钥,然后让客户端从Amazon S3等云文件中请求对象(仍然可能需要分页才能获取文件名).

我没有想到的是愚蠢的简单和比任何这些选项更好的方式?

api postgresql pagination distributed-computing

12
推荐指数
1
解决办法
2394
查看次数

Cassandra中的主键是否可以包含集合列?

Cassandra中的主键是否可以包含集合列?

例:

CREATE TABLE person (
  first_name text,
  emails set<text>,
  description text

  PRIMARY KEY (first_name, emails)
);
Run Code Online (Sandbox Code Playgroud)

cassandra

12
推荐指数
3
解决办法
5104
查看次数

RESTful资源 - 接受对象列表

我正在构建一个RESTful资源集合,其工作方式如下:(我将以"people"为例):

    GET /people/{key}
      - returns a person object (JSON)
    GET /people?first_name=Bob
      - returns a list of person objects who's "first_name" is "Bob" (JSON)
    PUT /people/{key}
      - expects a person object in the payload (JSON), updates the person in the 
        datastore with the {key} found in the URL parameter to match the payload.
        If it is a new object, the client specifies the key of the new object.

到目前为止,我对设计感到非常满意(尽管欢迎任何投入/批评).

我也希望能够列出一个人的列表,但是我对我的设计的RESTful性并不自信.这就是我的想法:

    PUT /people
      - expects a list of objects in JSON form …

rest

11
推荐指数
2
解决办法
1万
查看次数

"git add*.js"没有在子目录中添加文件

试图做出一些改变.我曾经git add使用通配符添加了我可能创建的任何新的javascript文件*.js.然后我提交了更改并推送到github:

git add *.js
git commit -m "stuff"
git push github master

当我检查github时,我编辑的所有文件都是空白的.他们在那里,只是空着.

然后我再次尝试提交,但GIT说一切都是最新的.

然后我回过头来注意到,在我做完之后git commit -m "stuff",GIT显示了一条消息,说我的一些".js"文件没有上演,即使我刚刚使用通配符添加它们:git add *.js.这是我尝试提交时显示的消息.

# On branch master
# Changes not staged for commit:
#   (use "git add/rm ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   src/static/directory1/js/module1/file1.js
#       modified:   src/static/directory1/js/module1/file2.js
#       modified:   src/static/directory1/js/module2/file1.js

为了解决这个问题,我必须在执行git add以下操作时查看几个目录:

git add src/static/directory1/*.js

这看起来很有效,因为在我再次提交之后文件就在那里然后推送到github: …

git github

11
推荐指数
3
解决办法
4879
查看次数

Javascript中的IP地址解析器

为Javascript寻找一个好的IP地址解析器.

理想情况下,它可以将IP地址作为字符串,然后返回包含IP地址的所有部分的对象,包括端口.

谢谢!

javascript parsing ip-address

11
推荐指数
1
解决办法
4538
查看次数

MessageDigest在不同的计算机上散列不同

我遇到MessageDigest在不同计算机上返回不同哈希值的问题.

一台计算机在Windows Vista上运行32位Java,另一台在Mac OS上运行64位Java.我不确定是不是因为MessageDigest是依赖于机器的,或者我需要在某处明确指定字符编码,或者可能是其他东西.这是代码:

public static boolean authenticate(String salt, String encryptedPassword, 
    char[] plainTextPassword ) throws NoSuchAlgorithmException {

    // do I need to explcitly specify character encoding here? -->
    String saltPlusPlainTextPassword = salt + new String(plainTextPassword);

    MessageDigest sha = MessageDigest.getInstance("SHA-512");

    // is this machine dependent? -->
    sha.update(saltPlusPlainTextPassword.getBytes());
    byte[] hashedByteArray = sha.digest();

    // or... perhaps theres a translation problem here? -->
    String hashed = new String(hashedByteArray);

    return hashed.equals(encryptedPassword);
}
Run Code Online (Sandbox Code Playgroud)

这些代码应该在这两台不同的机器上执 如果它与我编写它的方式是机器相关的,那么还有另一种方法来散列这些更便携的密码吗?谢谢!

编辑:::::

这是我用来生成盐的代码:

public static String getSalt() {
   int size = 16; …
Run Code Online (Sandbox Code Playgroud)

java hash consistent-hashing

10
推荐指数
2
解决办法
1万
查看次数