Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine Google应用程序引擎内存缓存性能低_Google App Engine_Memcached - Fatal编程技术网

Google app engine Google应用程序引擎内存缓存性能低

Google app engine Google应用程序引擎内存缓存性能低,google-app-engine,memcached,Google App Engine,Memcached,Memcache就是这样一种东西,它的解决方案可以是任何东西,但没有人真正给出一个像样的答案,可能是因为根本没有。所以我不是在寻找一个直接的答案,但也许只是让我朝着正确的方向前进 对于典型请求,以下是我的AppStats信息: 因此,在总共440毫秒的请求中,我在memcache中花费了342毫秒。在这里,我认为memcache应该是闪电般的快。我一定是做错了什么 查看管理控制台中的memcache统计数据,我发现: Hit count: 3848 Miss count: 21382 Hit

Memcache就是这样一种东西,它的解决方案可以是任何东西,但没有人真正给出一个像样的答案,可能是因为根本没有。所以我不是在寻找一个直接的答案,但也许只是让我朝着正确的方向前进

对于典型请求,以下是我的AppStats信息:

因此,在总共440毫秒的请求中,我在memcache中花费了342毫秒。在这里,我认为memcache应该是闪电般的快。我一定是做错了什么

查看管理控制台中的memcache统计数据,我发现:

Hit count:  3848
Miss count: 21382
Hit ratio:  15%
我不是这方面的专家,但我敢肯定15%是可怕的

上面的典型请求有点过于详细,无法解释,但基本上,我创建并放置了一个新实体,它还更新并放置了一个父实体,它还更新并放置了与父实体关联的任何用户

在这一切过程中,我总是按钥匙,从不询问。哦,我用的是NDB,所以所有的都是基本的。因此,在我的代码中,我从未亲自手动触摸memcache

有什么想法吗

编辑:这是我的请求的细目


所以我只有2个数据存储get和2个put。其余的则由memcache自动处理。为什么它要做这么多工作?手动处理这些数据会更好吗?

让我们仔细看看您的数据。七次memcache写入所花费的时间相当于两次数据存储写入所花费的时间。这实际上证明了memcache的速度是Datastore的3.5倍

如果对应用程序的典型请求要求至少更新三个数据库实体,然后再更新更多实体(关联的用户),则无法使此操作“闪电般快速”。当您读取条目的频率比写入条目的频率高得多时,Memcache会提供帮助。如果对用户记录的读取和写入量是平价的,则应该考虑这个模型。

你也可以试试看。根据您的描述,您似乎尝试首先更新实体,并且仅在更新完成后更新其父实体,因为这是自然的。您可以同时运行这些程序;这可能需要一些重构,但这是值得的


第二,更新“所有相关用户”可能是。推迟到后台生成的任务;有一个非常方便的界面。“关联用户”不会立即更新,但他们可能不需要更新!但是,您请求的延迟将小于此时间。

如果不确切知道您在做什么,以及您的数据模型是什么样子,就不可能给您任何好的建议。@JasonHall ya我想。我正在使用NDB,所以我没有手动处理任何memcache。这是全自动的。所以我想知道是什么导致它在memcache中占用342?即使在绝对最坏的情况下,memcache真的需要那么长时间吗?你可能想控制一下你的memcache是什么/如何进行的——把它留给NDB不会神奇地解决你的问题,特别是因为NDB不知道你在尝试做什么。例如,在可能的情况下,使用
set\u multi
而不是
set
来批处理memcache请求。@JasonHall老实说,我没有做任何疯狂的事情。这只是一堆“得到”和“付出”,都是通过按键实现的。一些人使用ndb.get_multi,其他人则分散使用。我认为对于这样的基本行为,NDB缓存可能就可以处理这个问题。在任何情况下,我上面看到的数字是不是很糟糕?这是我第一次使用GAE,所以我没有任何东西可以与之比较。@JasonHall不确定它是否有用,但请查看更新。。你是说,考虑到我更新实体的频率,这是memcache的预期行为?我尽可能使用异步操作。我还没有考虑过任务队列,但这似乎是个好主意。@mohabitar我使用AppEngine的经验是,每个系统调用都可以非零概率“尖峰”(比如,从通常的10毫秒到50毫秒)。因此,您调用的RPC调用越多,其中一个RPC调用出现峰值的可能性就越大,并给您带来更高的延迟。如果在每次访问时同时更新memcache和datastore,则可能会为操作带来更高的峰值风险。如果在两次写入之间,有大量读取在memcache级别解决,则这种风险可能是合理的。如果你不这样做,你可能会更好没有缓存在所有。