Google app engine 为什么GoogleDataStore第二次查询返回修改后的实例(在第一次查询后不调用put)?
我在查询数据存储时遇到了一个非常违反直觉的情况 以下是步骤:Google app engine 为什么GoogleDataStore第二次查询返回修改后的实例(在第一次查询后不调用put)?,google-app-engine,app-engine-ndb,google-cloud-datastore,Google App Engine,App Engine Ndb,Google Cloud Datastore,我在查询数据存储时遇到了一个非常违反直觉的情况 以下是步骤: 使用第一个查询检索对象:list\u objects=MyModel.query(cls.name==name.fetch() 修改列表对象:中o的列表对象:o.value=new\u值 第二次检索对象:list\u objects\u 2=MyModel.query(cls.name==name.fetch() 现在,list_objects_2中的所有对象都有了新的_值,尽管在步骤2中,从未调用put来实际修改数据存储,我检查了中
list\u objects=MyModel.query(cls.name==name.fetch()
中o的列表对象:o.value=new\u值
list\u objects\u 2=MyModel.query(cls.name==name.fetch()
:o.value=new\u new\u value
,现在列表对象1都具有new\u new\u值fetch(keys_only=True)
和k.get()
,但问题相同
我的印象是,查询是针对实际数据存储的,为什么它总是返回相同的实例,而不是构建新的实例?这是由于某种缓存造成的吗?请查看本文
上下文缓存速度快;这个缓存存在内存中。当NDB
函数写入数据存储,同时也写入上下文中的
隐藏物当NDB函数读取实体时,它会在上下文中检查实体
先缓存。如果在那里找到实体,则不存在数据存储交互
发生了
当NDB函数查询数据存储时,结果列表为
从数据存储中检索。但是,如果有任何单独的结果
在上下文缓存中,它用于替换从中检索的值
数据存储查询。查询结果将写回上下文中
如果缓存策略这么说,则缓存(但决不向Memcache)
1) list\u objects=MyModel.query(cls.name==name.fetch()
在上下文缓存中预热
2) 对于列表中的o对象:o.value=新值
仅修改内存中的对象
3) list\u objects\u 2=MyModel.query(cls.name==name.fetch()
实际上,没有数据存储交互发生,您从缓存中获取相同的对象
4) 对于列表对象中的o:o.value=new\u new\u value
仅修改内存中的对象
5)
fetch(keys\u only=True)
和k.get()
没有发生数据存储交互听起来不对,你能给出一个可重复的例子吗?谢谢!事实就是这样。我在反复试验后发现了这一点,它与进程内缓存有关,如果我添加fetch(use_cache=False),那么查询将返回新实例,尽管我有点惊讶为什么进程内缓存在默认情况下是打开的。