2

我想保留一些应用程序配置条目作为数据存储区中的实体。现在,当我从数据存储查看器(开发环境)或Google Cloud Platform数据存储用户界面(生产环境)更新这些条目时,应用程序不会看到新值。这是因为ndb缓存实体。如何刷新Google App Engine数据存储区中保存的配置条目?

我的(相当开放的)问题是:在数据存储中保存配置条目,从Google的用户界面更新配置条目以及为应用程序提供新值的技术是什么?

我已经想到以下的:

  1. ndb.Model子类定义了配置条目设置一个合理_memcache_timeout - 但内存缓存的用法是在这种情况下,次优的(执行不必要的数据存储区中读取)。

  2. 将缓存设置保持为最大值,但在应用程序的管理区域中执行flush操作以单独刷新实体。这很棘手,因为您无法确定实体的实际缓存键。但通常应该是_memcache_prefix + key.urlsafe(),其中_memcache_prefixndb.context module中定义。

  3. 更新应用程序管理区域中的所有配置条目,但不使用Google的数据存储用户界面 - 这需要额外的努力。

+1

在生产环境和开发环境控制台上,您都可以进入memcache查看器并在更新值后手动刷新缓存。您的应用不应再看到较旧的值。这会刷新所有条目,但影响应该很小 - 无论如何,您的应用程序应该准备好处理消失的memcache值。 –

+1

根据您的应用程序使用这些配置的方式,您可能还需要重新启动已在运行的应用程序实例。 –

+0

@DanCornilescu我也将缓存用于其他目的(不仅用于存储配置条目)。在我的情况下,刷新整个缓存对性能的影响是不可忽视的。但是在其他情况下你的想法听起来很棒。 –

回答

2

选项1 - 大多数工作

实现在App Engine中使用NDB客户端库自己的管理模块。如果您通过自己的应用对实体进行更改,那么它自然会为您编写正确的内存缓存密钥。

选项2 - 用于更新交易成本延迟

正如你已经暗示,减少最大缓存年龄模型。例如,在大多数情况下,在变更生效之前允许1小时的时间并不是不合理的。

选择3 - 最不工作,而是通过云端控制台大规模

刷新整个缓存一个坏主意的内存缓存。

警告:如果你在大规模运行,这是一个坏主意,因为它可能会导致请求的巨大高峰。例如,如果您在90%的缓存命中率之后以100万次读取/秒的速度运行数据存储,则可以在刷新后立即达到1000万次读取/秒。

+2

选项1不必很复杂 - 你需要的只是一个简单的(受保护的)处理程序,它触发清理必要的Memcache条目(例如“/ admin/update_config”) –

+1

@AndreiVolgin - 事实上它并没有,但它仍在设置增加更多的代码/服务。最终,它可以作为为应用程序构建更多功能管理体验的跳板点,例如定时更新,回滚,日志记录,更改验证等。 –

相关问题