Поддерживает ли SQLAlchemy кеширование?
-
03-07-2019 - |
Вопрос
Поддерживает ли SQLAlchemy какое-то кэширование, поэтому, если я повторно запускаю один и тот же запрос, он возвращает ответ из кеша вместо запроса к базе данных?Этот кеш автоматически очищается при обновлении БД?
Или как лучше всего реализовать это в настройке CherryPy + SQLAlchemy?
Решение
У нас есть довольно комплексное решение для кэширования, например, в сочетании со встроенными перехватчиками в версии 0.6.Это рецепт создания подкласса Query, информирования его о Beaker и разрешения управления кэшированием запросов для явных запросов, а также для ленивых загрузчиков с помощью параметров запроса.
Сейчас я запускаю его в производство.Сам пример находится в дистрибутиве, а вступительная документация — по адресу http://www.sqlalchemy.org/docs/orm/examples.html#beaker-caching .
ОБНОВЛЯТЬ:Стакан теперь заменен на dogpile
кэширование: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.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-examples.dogpile_caching
Кэширование
query
объект, чтобы интерпретатору Python не приходилось каждый раз заново собирать строку запроса вручную.Эти запросы называютсяbaked queries
и кэш называетсяbaked
.По сути, он кэширует все действияsqlalchemy
требуется ДО обращения к базе данных - это не сокращает количество вызовов базы данных.Первоначальные тесты показывают ускорение до 40% вquery
время генерации за счет небольшого увеличения детализации кода.Документы здесь: http://docs.sqlalchemy.org/en/latest/orm/extensions/baked.html
Или используйте кеш уровня приложения через словари слабых ссылок (weakref.WeakValueDictionary), см. пример здесь: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject