Pergunta

O SQLAlchemy apoiar algum tipo de cache, então se eu repetidamente executar a mesma consulta que retorna a resposta do cache em vez de consultar o banco de dados? É esse cache apagadas automaticamente quando o DB está atualizado?

Ou qual é a melhor maneira de implementar isso em uma configuração CherryPy + SQLAlchemy?

Foi útil?

Solução

Nós temos uma solução bastante abrangente caching, como um exemplo em conjunto com ganchos embarcados, em 0,6. É uma receita a subclasse Query, torná-lo consciente da taça, e permitir o controle de cache de consulta para consultas explícitas, bem como carregadores preguiçosos via opções de consulta.

Estou executando-lo em produção agora. O exemplo em si é na dist ea documentação introdução é em http: // www.sqlalchemy.org/docs/orm/examples.html#beaker-caching .

UPDATE: Copo agora foi substituído por caching dogpile: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching

Outras dicas

Não é uma resposta à sua segunda pergunta, mas a partir dos comentários em este link indica que SQLAlchemy não suporta cacheing: http://spyced.blogspot.com/2007/01/why-sqlalchemy-impresses-me.html

Corvo disse ...

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 disse ...

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 suporta dois tipos de caches:

  1. cache do conjunto de resultados para que repetidamente executar a mesma consulta atinge o cache em vez do banco de dados. Ele usa dogpile que suporta muitos backends diferentes, incluindo memcached, redis e arquivos básicos planas.

    Docs está aqui: http: // docs. sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching

  2. Cache o objeto query para que Python intérprete não tem que manualmente re-montar a string de consulta de cada vez. Essas consultas são chamados baked queries eo cache é chamado baked. Basicamente ele armazena todo o sqlalchemy ações leva antes de bater o banco de dados - não reduzir o tempo de chamadas de banco de dados. Testes iniciais mostram aumentos de velocidade de até 40% no tempo de geração query na troca de um ligeiro aumento na verbosity código.

    Docs está aqui: http://docs.sqlalchemy.org/ en / latest / ORM / extensões / baked.html

Ou usar um cache de nível de aplicativo via fracos dicts referências (weakref.WeakValueDictionary), veja um exemplo aqui: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top