2013-02-08 35 views
0

我有一个奇怪的问题。在一个任务我从数据库中提取数据,并将其写入到异步内存缓存:除了写入Memcache的1MB还有其他限制吗?

ke = database.Events.query(database.Events.eventid.IN(eventslist)) 
eventskeys = ke.fetch(len(eventslist),keys_only = True) 

data = ndb.get_multi(eventskeys) 

eventsdic = {} 

for event in data: 
    eventsdic.update({event.eventid: event.participants}) 

client = memcache.Client() 

rpc = memcache.create_rpc()  
response = client.set_multi_async(eventsdic, time=3600, rpc=rpc) 

的事件列表中有20个项目。我这样做约500个项目分散在队列中的不同任务。

我没有收到任何错误。但是我注意到,在第一次尝试之后,500个事件中的大约300个确实存在于内存缓存中。如果我只对事件进行了2-3次重试,这些事件现在还不在memcache中,但在一段时间后,我有100%的memcache。

但我真的不明白,为什么它不适用于第一次尝试?

回答

0

这可能是因为memcache“监视”您的数据。经常使用的物品不太可能被驱逐。这是(据我了解)不是简单的FIFO型系统

对我来说这不是一个“问题”,因此,如果我将某些东西放入内存缓存中,那么当我稍后请求时,它就不存在了。我将使用我放入的回退机制来应对这种情况。你根本不能假设任何东西将会在memcache中,当你要求它。

https://developers.google.com/appengine/articles/scaling/memcache

代价是内存缓存中保存的数据是短暂的,作为系统运行的内存缓存空间被驱逐。在极少数情况下,所有memcached数据都可以一次性清除。

+0

谢谢 - 但是数据在被写入memcache之后几秒钟就被驱逐了?这个任务已经是我的后备,恢复了我发现不存在的memcache数据。 – 2013-02-08 12:59:15

+0

我想它可以,如果你加入*加载*的内容,它会驱逐它的一部分,如果它的空间不足。事实是,它确实有点不透明。尝试做一些测试,而不是500与50试试 - 看看它是否在那之后。即便如此,无论你发现,我想可能会随着资源转移而发生变化。 – 2013-02-08 13:01:42

+0

另请注意,它从未被提及*给定应用程序有多少* memcache可用? – 2013-02-08 13:02:20

相关问题