Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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数据存储(Python)中删除对象并使用Memcache_Python_Google App Engine_Memcached_Google Cloud Datastore - Fatal编程技术网

从Google App Engine数据存储(Python)中删除对象并使用Memcache

从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

我正在尝试从GAE数据存储中删除一个对象,然后使用memcache缓存其余的数据存储对象。正在成功删除该对象,但由于某些原因,python日志和memcache无法识别该对象已被删除。数据存储查看器显示对象已被删除,但日志显示项目的长度没有改变。。。此外,memcache只是缓存所有的项,就好像没有删除一样。非常感谢您提供的任何建议

Python代码:

 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为您管理模型缓存。我使用的是“会话”一词,但它实际上是一个聊天会话,不一定是所有登录的人。我想做的只是更新这个可供聊天的人的列表。因此,当一个会话被删除时,一个人会掉下来——因此缓存需要在可用列表中没有这个人的情况下更新。(只是尽量不让数据库中的内容超出我的需要)-但我成功了-丹尼尔关于祖先和最终一致性的想法是正确的。解释: