- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 GAE 数据存储进行一些练习,以了解查询和计费机制。
我已经阅读了关于 GAE 的 Oreilly 书籍,并观看了关于数据存储的 Google 视频。我的问题是,最佳实践方法通常涉及对数据存储的读取多于写入。
我构建了一个 super 简单的应用程序:
在这种情况下,由于用户可以选择任意数量的链接,只要他愿意,我的应用程序写入数据存储区的次数远远超过读取次数(写入 - 当用户选择另一个链接时;读取 - 当用户打开网页查看他的“链接提要”)
问题 1:我可以想到(至少)两个选项来处理这个应用程序的数据:
选项 A:- 使用用户详细信息、注册等维护每个用户的实体- 为每个用户维护另一个实体,其中包含他最近选择的 10 个链接,这些链接将在用户请求后呈现到用户的网页上
选项 B:- 维护每个 url 链接的实体 - 这意味着所有用户的所有 url 将存储为同一对象- 维护每个用户详细信息的实体(与选项 A 中相同),但在 url 的大表中添加对用户 url 的引用
什么是更好的方法?
问题 2:如果我想计算到今天为止选择的 url 总数,或者用户每天选择的 url 数量,或者任何其他计数——我应该将它与我的 SDK 工具一起使用,还是应该在我上面描述的实体中插入计数器? (我想尽可能减少数据存储的写入量)
编辑(回答@Elad 的评论):假设我只想为每个用户保存最后 10 个 url。其余的我想摆脱(这样就不会用不必要的数据填充我的数据库)。
编辑 2:添加代码后所以我尝试使用以下代码(首先尝试 Elad 的方法):
这是我的类(class):
class UserChannel(db.Model):
currentUser = db.UserProperty()
userCount = db.IntegerProperty(default=0)
currentList = db.StringListProperty() #holds the last 20-30 urls
然后我将 url 和元数据序列化为 JSON 字符串,用户从第一页发布。以下是 POST 的处理方式:
def post(self):
user = users.get_current_user()
if user:
logging messages for debugging
self.response.headers['Content-Type'] = 'text/html'
#self.response.out.write('<p>the user_id is: %s</p>' % user.user_id())
updating the new item that user adds
current_user = UserChannel.get_by_key_name(user.nickname())
dataJson = self.request.get('dataJson')
#self.response.out.write('<p>the dataJson is: %s</p>' % dataJson)
current_user.currentPlaylist.append(dataJson)
sizePlaylist= len(current_user.currentPlaylist)
self.response.out.write('<p>size of currentplaylist is: %s</p>' % sizePlaylist)
#whenever the list gets to 30 I cut it to be 20 long
if sizePlaylist > 30:
for i in range (0,9):
current_user.currentPlaylist.pop(i)
current_user.userCount +=1
current_user.put()
Updater().send_update(dataJson)
else:
self.response.headers['Content-Type'] = 'text/html'
self.response.out.write('user_not_logged_in')
其中 Updater 是我使用 Channel-API 更新带有提要的网页的方法。
现在,一切正常,我可以看到每个用户都有一个包含 20-30 个链接的 ListProperty(当达到 30 个时,我使用 pop() 将其减少到 20 个),但是!价格相当高...像这里这样的每个 POST 需要 ~200ms,121 cpu_ms,cpm_usd= 0.003588。考虑到我所做的只是将一个字符串保存到列表中,这是非常昂贵的......我认为问题可能是实体随着大 ListProperty 变大了吗?
最佳答案
首先,您担心大量写入 GAE 数据存储是正确的 - 我自己的经验是,与读取相比,它们的开销非常大。例如,我的一个应用程序除了在单个模型表中插入记录外什么都不做,每天写入几万次就用完了免费配额。因此,高效地处理写入会直接转化为您的底线。
第一个问题
我不会将链接存储为单独的实体。数据存储不是 RDBMS,因此标准规范化实践不一定适用。对于每个用户实体,使用 ListProperty 来存储最新的 URL 及其元数据(您可以将所有内容序列化为一个字符串)。
另一个优化思路:如果你的用户经常在短时间内添加多个链接,你可以尝试批量编写而不是单独编写。使用内存缓存存储新添加的用户 URL,使用任务队列定期将临时数据写入持久数据存储。我不确定使用任务的资源成本是多少——你必须检查一下。 Here's a good article阅读主题。
第二个问题
使用计数器。请记住,它们在分布式环境中并非微不足道,因此请阅读 - 有许多关于该主题的 GAE 文章、食谱和博客文章 - 只需 google appengine counters .在这里,使用内存缓存也应该是一个不错的选择,以减少数据存储写入的总数。
关于python - GAE 数据存储 - 写入多于读取时的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5603591/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!