从Google App Engine数据存储(Python)中删除对象并使用Memcache
我正在尝试从GAE数据存储中删除一个对象,然后使用memcache缓存其余的数据存储对象。正在成功删除该对象,但由于某些原因,python日志和memcache无法识别该对象已被删除。数据存储查看器显示对象已被删除,但日志显示项目的长度没有改变。。。此外,memcache只是缓存所有的项,就好像没有删除一样。非常感谢您提供的任何建议 Python代码:从Google App Engine数据存储(Python)中删除对象并使用Memcache,python,google-app-engine,memcached,google-cloud-datastore,Python,Google App Engine,Memcached,Google Cloud Datastore,我正在尝试从GAE数据存储中删除一个对象,然后使用memcache缓存其余的数据存储对象。正在成功删除该对象,但由于某些原因,python日志和memcache无法识别该对象已被删除。数据存储查看器显示对象已被删除,但日志显示项目的长度没有改变。。。此外,memcache只是缓存所有的项,就好像没有删除一样。非常感谢您提供的任何建议 Python代码: yesterday = datetime.now()-timedelta(days=1) # one day ago
yesterday = datetime.now()-timedelta(days=1) # one day ago
sessions = db.GqlQuery("SELECT * FROM MentorAvailSessions WHERE created > :1", yesterday).fetch(1000) #pulling list of all objects
logging.info('************** len before deleting a session: %s*********' % len(sessions)) # shows a length of 3
for session in sessions:
if (session.session_id == end_session_id) and (session.user == user_info.username):
session.delete();
remaining_sessions = db.GqlQuery("SELECT * FROM MentorAvailSessions WHERE created > :1", yesterday).fetch(1000) #pulling list of just the remaining objects after deleting one
logging.info('** len of remaining sessions: %s' % len(remaining_sessions)) # still shows a length of 3 after session.delete
memcache.set('mentor_avail_sessions_cache', remaining_sessions, time=50000) # is caching all three items instead of just the remaining 2
这是由于最终的一致性。没有祖先的查询不能保证强一致性(dev服务器夸大了这种影响,使您意识到这一点,在生产中您很少看到不一致)
您应该确保查询使用祖先,以便它提供给实体组。或者,你可以显式地减少memcache计数器,而不是从查询中刷新它。谢谢Daniel-我有点不明白,你能给我一个如何减少memcache计数器的例子吗?谢谢,我读了你的链接,但我仍然不确定如何指定如何从memcache中删除特定会话。。。需要删除的可能不是最后添加的。对不起,我误解了:我以为你在用memcache记录。我必须说,我一点也不明白为什么要使用memcache来存储所有会话。这就是数据存储的用途,特别是当你说你没有任何方法可以识别缓存的数据时。你真的不应该这么做。请注意,
ndb
api为您管理模型缓存。我使用的是“会话”一词,但它实际上是一个聊天会话,不一定是所有登录的人。我想做的只是更新这个可供聊天的人的列表。因此,当一个会话被删除时,一个人会掉下来——因此缓存需要在可用列表中没有这个人的情况下更新。(只是尽量不让数据库中的内容超出我的需要)-但我成功了-丹尼尔关于祖先和最终一致性的想法是正确的。解释: