SQLAlchemy是否支持某种缓存,因此如果我重复运行同一查询,它会从缓存返回响应,而不是查询数据库?数据库更新时是否自动清除此缓存?
或者,在CherryPy+SQLAlchemy设置上实现这一点的最佳方法是什么?
我们在0.6中有一个非常全面的缓存解决方案,作为与嵌入式挂钩结合的示例。这是一个将Query子类化的方法,使其了解Beaker,并允许通过查询选项控制显式查询的查询缓存以及懒惰加载程序。
我现在正在生产中运行它。示例本身在dist中,介绍文档位于http://www.sqlalchemy.org/docs/orm/examples.html#beaker-缓存。
更新:Beaker现已替换为dogpile
缓存:http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-示例.dogpile_caching
这不是你第二个问题的答案,但从这个链接中的评论来看,SQLAlchemy不支持缓存:http://spyced.blogspot.com/2007/01/why-sqlalchemy-impresses-me.html
瑞文说
Does SQLAlchemy do any kind of internal caching? For example, if you ask for the same data twice (or an obvious subset of the initially requested data) will the database be hit once or twice? I recently wrote a caching database abstraction layer for an application and (while fun) it was a fair bit of work to get it to a minimally functional state. If SQLAlchemy did that I would seriously consider jumping on the bandwagon. I've found things in the docs that imply something like this might be going on, but nothing explicit. 4:36 PM
乔纳森·埃利斯说
No; the author of SA [rightly, IMO] considers caching a separate concern. What you saw in the docs is probably the SA identity map, which makes it so if you load an instance in two different places, they will refer to the same object. But the database will still be queried twice, so it is not a cache in the sense you mean.
SQLAlchemy支持两种类型的缓存:
-
缓存结果集,以便重复运行同一查询会命中缓存而不是数据库。它使用支持许多不同后端的
dogpile
,包括memcached
、redis
和基本平面文件。文档在这里:http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-示例.dogpile_caching
-
缓存
query
对象,这样Python解释器就不必每次手动重新组装查询字符串。这些查询被称为baked queries
,高速缓存被称为baked
。基本上,它缓存sqlalchemy
在访问数据库之前执行的所有操作——它不会减少数据库调用。最初的基准测试显示,在代码详细度略有增加的情况下,query
生成时间的加速率高达40%。文档在这里:http://docs.sqlalchemy.org/en/latest/orm/extensions/baked.html
或者通过弱引用dicts(weakref.WeakValueDictionary)使用应用程序级缓存,请参阅此处的示例:http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject