¿SQLAlchemy admite el almacenamiento en caché?
-
03-07-2019 - |
Pregunta
¿SQLAlchemy admite algún tipo de almacenamiento en caché, por lo que si ejecuto repetidamente la misma consulta, devuelve la respuesta del caché en lugar de consultar la base de datos? ¿Esta memoria caché se borra automáticamente cuando se actualiza la base de datos?
¿O cuál es la mejor manera de implementar esto en una configuración de CherryPy + SQLAlchemy?
Solución
Tenemos una solución de almacenamiento en caché bastante completa, como un ejemplo junto con enlaces integrados, en 0.6. Es una receta para hacer una subclase de consultas, informarle de Beaker y permitir el control del almacenamiento en caché de consultas para consultas explícitas, así como para cargadores diferidos mediante opciones de consulta.
Lo estoy ejecutando en producción ahora. El ejemplo en sí está en dist y la documentación de introducción está en http: // www.sqlalchemy.org/docs/orm/examples.html#beaker-caching .
ACTUALIZACIÓN: Beaker ahora se ha reemplazado por el almacenamiento en caché dogpile
: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching
Otros consejos
No es una respuesta a su segunda pregunta, pero a partir de los comentarios en este enlace indica que SQLAlchemy no admite el almacenamiento en caché: http://spyced.blogspot.com/2007/01/why-sqlalchemy-impresses-me.html
Raven dijo ...
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
Jonathan Ellis dijo ...
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 admite dos tipos de cachés:
-
El almacenamiento en caché del conjunto de resultados para que la ejecución repetida de la misma consulta llegue a la memoria caché en lugar de a la base de datos. Utiliza
dogpile
que admite muchos backends diferentes, incluidosmemcached
,redis
y archivos planos básicos.Los documentos están aquí: http: // docs. sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching
-
Almacenar en caché el objeto
query
para que el intérprete de Python no tenga que volver a ensamblar manualmente la cadena de consulta cada vez. Estas consultas se denominanconsultas horneadas
y la caché se llamabaked
. Básicamente, almacena en caché todas las acciones quesqlalchemy
toma ANTES de golpear la base de datos, no reduce las llamadas a la base de datos. Los puntos de referencia iniciales muestran aceleraciones de hasta un 40% en el tiempo de generación dequery
en la compensación de un ligero aumento en la verbosidad del código.Los documentos están aquí: http://docs.sqlalchemy.org/ es / latest / orm / extensions / baked.html
O use un caché de nivel de aplicación a través de referencias de referencias débiles (weakref.WeakValueDictionary), vea un ejemplo aquí: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject