Há mais de uma maneira de armazenar em cache.
GET condicional
Se você estiver armazenando essas imagens no sistema de arquivos e as servindo diretamente através do servidor da web, provavelmente já está usando o get condicional . O servidor da Web usará automaticamente os metadados do sistema de arquivos para definir um cabeçalho ETAG e responderá automaticamente com "304 não modificado" se o navegador incluir If-Modified-Since
ou If-Matches
cabeçalhos em sua solicitação. (Todos os navegadores irão.)
Nesse caso, a imagem inteira não é exibida novamente, portanto, você tem economia de largura de banda. No entanto, uma solicitação GET ainda será emitida, portanto você ainda terá a sobrecarga e a latência de uma solicitação.
Você pode diminuir um pouco o número de solicitações à custa da atualização do cache, solicitando que o servidor da Web defina Cache-Control
cabeçalhos com um public,max-age=N
valor para suas imagens. Isso indica que os caches podem manter o recurso por no máximo max-age
segundos antes que eles precisem verificar se está atualizado.
No entanto, o HTTP define apenas uma maneira de invalidar uma entrada de cache, o que pode não se encaixar na semântica do aplicativo: se você POST ou PUT em um URL que atualiza a foto do perfil, responda com um Location: [url of photo]
cabeçalho e a entrada de cache desse URL será invalidada.
(Esse é o mecanismo que permite armazenar em cache uma página da Web com comentários e, em seguida, recarregar à força a página pelo navegador depois que o usuário postar um novo comentário. O navegador responderia a um POST /comment
com 303 See Other
e um Location: /page/with/comment
. Observe que isso não foi usado para trabalhar no Firefox devido a um bug antigo .)
A menos que você tenha muito tráfego, essa abordagem ao cache é boa.
Alterando URLs
Uma URL é uma representação de um recurso; portanto, outra maneira de gerenciar o cache não é alterar os parâmetros de cache do recurso, mas criar um novo recurso com uma diretiva "cache para sempre". Essa é a abordagem que os "garotos grandes" favorecem, porque permite que eles não gerem solicitações extras, economizando muita largura de banda. A desvantagem é que requer muito mais contabilidade adicional.
Existem duas técnicas gerais para isso.
Cadeias de consulta
Servidores da Web ignoram cadeias de consulta ao exibir um arquivo do sistema de arquivos. Os caches, no entanto, não são : /1.jpg?t=12345
e /1.jpg?t=67890
são dois recursos independentes e completamente diferentes, mesmo que o servidor pense que eles são iguais.
Portanto, uma coisa fácil que você pode fazer é anexar o registro de data e hora do sistema de arquivos como uma string de consulta sempre que você fizer uma referência a um recurso em seu html e definir um Expires
cabeçalho longo . O navegador armazenará esse recurso em cache para sempre e não fará nenhum GET, desde que a sequência de consultas não seja alterada.
Uma desvantagem é que é difícil ou impossível instruir o servidor da web do novo URL para um item se você deseja invalidar à força um cache. Por exemplo, se um navegador tiver uma página HTML em cache com uma /1.jpg?v=1
referência, mas limpar a entrada /1.jpg?v=1
(talvez o espaço no arquivo ou na memória fique sem memória), ele fará uma nova solicitação para /1.jpg?v=1
. Enquanto isso, a imagem foi alterada para /1.jpg?v=2
, a resposta adequada é:
- Sirva a versão antiga do arquivo. Você faria isso se quisesse que todos os recursos fossem consistentes entre si, como estavam em um determinado momento. Isto é o que você deve fazer com arquivos CSS, por exemplo, pois um novo arquivo css com um arquivo html antigo pode não funcionar corretamente!
- Redirecione para a nova versão do arquivo usando
301 Moved Permanently
. Você faria isso se quisesse que todos os recursos fossem os mais novos possíveis.
Isso é difícil de ser feito apenas com um servidor da Web, o que significa que você precisa chamar um aplicativo da Web mesmo para solicitações de imagem, o que pode ser mais complicado e com muitos recursos. Os servidores da Web são muito rápidos na veiculação de arquivos; portanto, a sobrecarga de um aplicativo da Web pode acabar engolindo seus ganhos de largura de banda e latência.
Nomes de arquivo
Em vez de adicionar uma string de consulta, você altera o nome do arquivo. Isso significa que é fácil manter várias versões de arquivos no sistema de arquivos, mas você provavelmente precisará armazenar os metadados dos arquivos e fazer outra contabilidade de banco de dados para acompanhar seus recursos e seus nomes.