首页 > 解决方案 > 出于计费目的,ndb 缓存读取操作是否仍计为数据存储读取操作?

问题描述

NDB 缓存

NDB 为您管理缓存。有两个缓存级别:上下文缓存和 App Engine 标准缓存服务 memcache 的网关。默认情况下,所有实体类型都启用这两种缓存,但可以进行配置以满足高级需求。

我的应用程序没有进行任何 ndb 缓存配置更改,因此它必须使用默认值 - 两个缓存级别都已启用。

我正在我的暂存环境(一个单独的专用 GAE 项目)上运行一些测试,在那里我可以将活动序列与任何虚假的外部请求完全隔离开来。

每个活动序列都由一系列相互触发的推送任务组成,创建数百个易失实体,修改其中一些可变次数,读取所有这些可变次数,最后将它们全部删除。

在序列期间仅访问少数其他已经存在的实体,所有这些实体在序列结束后仍然存在。对持久实体的访问次数应显着低于对易失实体的访问次数。

绝大多数读取操作是通过键或 id 进行实体查找,从keys_only查询或其他相关实体中获得。

我没有使用实体血统。这些任务中的大多数都执行跨组事务,我确实经常看到由于一些“热”实体上的数据争用而导致事务失败/重试(我估计在这次运行中大约有 200-400 个,很难计算在Stackdriver 日志页面)。

在每日配额重置后新执行一个这样的约 20 分钟序列后,应用程序的仪表板显示 Cloud Datastore 读取操作(0.03 万)是 Cloud Datastore 实体写入(0.01 万)的 3 倍。易失性实体的数量由 Cloud Datastore Entity Deletes (0.00089 百万) 指示,如果这很重要的话。

memcache 命中率为 81%,但我不知道这是否仅适用于我的应用程序的显式 memcache 使用,或者它是否包括 ndb 的 memcache 使用。

一些较早的类似测量但不是在干净的环境中产生类似的结果,我做了这个干净的测量作为验证。

这些观察结果似乎表明从缓存读取的实体仍算作数据存储读取。但在这里我假设:

我在文档中没有找到任何关于此的内容,因此想知道是否有人知道缓存的 ndb 读取是否确实算作数据存储读取,或者可以指出我的解释或有关该主题的一些官方文档中的缺陷。

标签: google-app-enginegoogle-cloud-datastoreapp-engine-ndb

解决方案


memcache 命中率包括 ndb 写入的实体的命中率。它不包括 ndb 的上下文缓存命中数。

每次写入数据存储都会使缓存失效,因此下一次读取不会缓存在 memcache 或上下文缓存中。

另一件事是 ndb 为每个事务创建一个新的上下文缓存,因此上下文缓存在面对事务时不是很有效。

快速回答是,对数据存储实体的 memcache 命中不计入为计费目的读取的数据存储。


推荐阅读