Django UtilidadesMarinho Brandão

Jun/08 20

Método .cache() para QuerySet

django
Publicado há 6 months, 2 weeks por Marinho Brandao

Resolvi publicar este como um artigo separado. Por ser maior e mais importante.

No momento trata-se apenas de um patch em avaliação pelo core team. Se for adotada pelo framework, dificilmente será na versão 1.0, prevista para setembro [1].

A criação desse método, que depende de ajuste direto no código-fonte do framework, surgiu da necessidade de criar uma solução escalável para requisições redundantes ao banco de dados, especialmente as concorrentes.

Em resumo, quando utilizado encadeado a uma chamada de QuerySet [2], o método armazena o resultado do banco em cache e na próxima vez que aquela requisição for feita, ela será feita ao cache antes de chegar até o banco. O ganho de performance é notável, mas a escalabilidade ficou tremenda. O cache backend deve ser de preferência de memória, como o memcached [3] ou locmem [4]).

Seu uso pode ser bastante amplo e deve-se tomar o cuidado de respeitar o timeout e de usá-lo somente em requisições onde se tem uma visão clara quanto a essa chamada depender de atualizações constantes no banco de dados. Minha intuição é de que 90% das requisições não terão alterações relevantes em menos de 60 segundos, mas isso vai varia de acordo com a realidade do site ou sistema.

Usos mais prováveis do método:

Dentro de uma QuerySet declarada

class CategoriaManager(models.Manager):
    def get_query_set(self):
        q = super(CategoriaManager, self).get_query_set()

        return q.cache(300)

Observe que este código faz com que TODAS as requisições a banco feitos através deste manager sejam feitas através do recurso de cache. Isso é perigoso, viu?

Encadeado a uma QuerySet individual

lista = Video.all().cache(300)

Note que agora o uso do cache se limitou a uma chamada, um tanto genérica.

Moral da história: se você tem 1 usuário requisitando uma lista de Video, ela será armazenada por 300 segundos. Digamos que nesses próximos 300 segundos você tenha 100 requisições idênticas ao banco de dados (mesmo que partam de partes diferentes do código), todas essas requisições serão alimentadas pelo cache (e você sabe: memória é mais veloz que disco rígido). Quanto mais requisições simultâneas, mais robusto o sistema fica. Isso se chama escalabilidade. E claro, performance.

A idéia ficou tão legal, que já está fazendo influência, como o snippet [6].

Mais detalhes em [5]

Links relacionados

[1]http://code.djangoproject.com/wiki/VersionOneRoadmap
[2]http://www.djangoproject.com/documentation/db-api/#queryset-methods-that-return-new-querysets
[3]http://www.djangoproject.com/documentation/cache/#memcached
[4]http://www.djangoproject.com/documentation/cache/#local-memory-caching
[5]http://code.djangoproject.com/ticket/7338
[6]http://www.djangosnippets.org/snippets/815/

Links sociais


Comentários


Escreva o seu


.net adoradores ajax android apple banco de dados blogosfera brasil django emprego família gadgets google inovação java linux lua microsoft musica opensocial opinião publicidade python rails religiao screencast seguranca software-livre tdd web windows yadsel

Artigos recentes