我将我的员工存储在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发送到三个字典的列表中超过几分钟?
任何想法都表示赞赏。感谢
答案 0 :(得分:0)
除非您使用专用的memcache(付费服务),否则缓存的值可以随时被驱逐。
通过指定生命周期告诉memcache的是当您的值变为无效并且可以从memcache中删除时。但是,这并不能保证您的价值在memcache中保持那么久,它只是限制缓存值的最大生命周期。
注意:你在memcache中放的越多,其他值就越可能被丢弃。因此,您应该仔细考虑放入缓存中的数据。你绝对不应该把你在memcache中遇到的每一个值都放在一起。
旁注:在我最近工作的项目中,我们有一种 - 大约一天的最大缓存生存期。即使期望的生命周期更高,也没有缓存值持续更长的时间。有趣的是,虽然缓存每天大约在同一时间被清除,甚至包括非常新的值。
因此:永远不要依赖memcache。始终使用持久存储和内存缓存来提高流量的性能。