出于计费目的,ndb 缓存的读取操作是否仍算作数据存储读取操作?

2024-02-17

From NDB 缓存 https://cloud.google.com/appengine/docs/standard/python/ndb/cache:

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

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

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

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

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

绝大多数读取操作是通过键或 ID 进行实体查找,从以下位置获取keys_only查询或来自其他相关实体。

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

在每日配额重置后重新执行一个大约 20 分钟的序列后,应用程序的仪表板显示云数据存储读取操作(0.03 百万)比云数据存储实体写入(0.01 百万)多 3 倍。易失性实体的数量由云数据存储实体删除数(0.00089 百万)表示(如果重要)。

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

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

这些观察appear建议从缓存中读取的实体仍算作数据存储读取。但在这里我假设:

  • 在这大约 20 分钟内,没有太多内存缓存驱逐(应用程序没有专用的内存缓存存储桶)。
  • 每个写入操作都会使缓存无效,因此需要读取数据存储来更新缓存,但后续读取操作应来自缓存(直到下一个写入操作),这should如果不计算缓存的读取,则导致总体读取和写入计数相当可比
  • 我的(相当复杂的)应用程序代码确实符合我所描述的:)

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


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

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

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

简单的答案是,数据存储实体的内存缓存命中不会作为出于计费目的的数据存储读取而收费。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

出于计费目的,ndb 缓存的读取操作是否仍算作数据存储读取操作? 的相关文章

随机推荐