为什么appengine memcache没有在请求的时间段内存储我的数据?

时间:2016-02-05 13:55:13

标签: python google-app-engine cron memcached task-queue

我将我的员工存储在appengine ndb中,并且我通过taskque运行cron作业,以生成包含每个员工的电子邮件地址的字典列表。结果列表如下所示:

[{"text":"john@mycompany.com"},{"text":"mary@mycompany.com"},{"text":"paul@mycompany.com"}]

该列表用作变量角度组件的源数据,例如ngTags ngAutocomplete等。我想将列表存储在memcache中,以便Angular http调用运行得更快。

我遇到的问题是存储在memcache中的值永远不会持续超过几分钟,即使我将其设置为持续26小时。我知道存储的实际值不能超过1mb,因此作为实验,我将员工列表硬编码为仅包含三个值,问题仍然存在。

appengine控制台告诉我作业成功运行,如果我手动运行作业,它会将值加载到memcache中,但它们只会在那里停留几分钟。我之前已经多次使用了大量数据,所以我无法理解出了什么问题。我已启用结算功能,但我没有超额配额。

以下是用于将数据加载到内存缓存中的函数示例:

def update_employee_list():
try:
    # Get all 3000+ employees and generate a list of dictionaries
    fresh_emp_list = [{"text":"john@mycompany.com"},{"text":"mary@mycompany.com"},{"text":"paul@mycompany.com"}]

    the_cache_key = 'my_emp_list'
    emp_data = memcache.get(the_cache_key)

    # Kill the memcache packet so we can rebuild it.
    if emp_data is not None:
        memcache.delete(the_cache_key)

    # Rebuild the memcache packet      
    memcache.add(the_cache_key, fresh_emp_list, 93600) # this should last for 26 hours  

except Exception as e:
    logging.info('ERROR!!!...A failure occured while trying to setup the memcache packet: %s'%e.message)
    raise deferred.PermanentTaskFailure() 

以下是角度组件用于从memcache获取数据的函数示例:

@route
def get_emails(self):
    self.meta.change_view('json')
    emp_emails = memcache.get('my_emp_list')
    if emp_emails is not None:
        self.context['data'] = emp_emails
    else:
        self.context['data'] = [] 

以下是cron.yaml中的cron设置示例:

- url: /cron/lookups/update_employee_list
  description: Daily rebuild of Employee Data
  schedule: every day 06:00
  timezone: America/New_York 

为什么不能将memcache发送到三个字典的列表中超过几分钟?

任何想法都表示赞赏。感谢

1 个答案:

答案 0 :(得分:0)

除非您使用专用的memcache(付费服务),否则缓存的值可以随时被驱逐。

通过指定生命周期告诉memcache的是当您的值变为无效并且可以从memcache中删除时。但是,这并不能保证您的价值在memcache中保持那么久,它只是限制缓存值的最大生命周期。

注意:你在memcache中放的越多,其他值就越可能被丢弃。因此,您应该仔细考虑放入缓存中的数据。你绝对不应该把你在memcache中遇到的每一个值都放在一起。

旁注:在我最近工作的项目中,我们有一种 - 大约一天的最大缓存生存期。即使期望的生命周期更高,也没有缓存值持续更长的时间。有趣的是,虽然缓存每天大约在同一时间被清除,甚至包括非常新的值。

因此:永远不要依赖memcache。始终使用持久存储和内存缓存来提高流量的性能。