O que é um Cache?

Ao solicitar dados de qualquer fonte, sempre há algum atraso. O ping para servidores web é medido em milissegundos, o tempo de acesso ao armazenamento pode ter latências em microssegundos enquanto a latência da RAM é medida em ciclos de clock da CPU. Claro, esse tipo de velocidade teria sido impensável apenas algumas décadas atrás, mas no presente, eles nunca são rápidos o suficiente. A velocidade de acesso é regularmente uma forma de gargalo no desempenho. Uma das maneiras que isso pode ser resolvido é com o cache.

O armazenamento em cache é um processo de armazenamento de uma cópia temporária de um recurso de forma que possa ser acessado mais rapidamente do que normalmente. Há uma enorme variedade de implementações tanto em software quanto em hardware. Os caches podem atuar como caches de leitura, caches de gravação ou ambos.

Ler caches

Em um cache de leitura, os dados solicitados anteriormente são armazenados em um cache para acesso mais rápido. Em alguns cenários, o cache pode até ser carregado preventivamente com dados, permitindo que a primeira solicitação seja atendida a partir do cache, em vez de apenas solicitações subsequentes.

O cache de leitura com o qual você provavelmente está familiarizado é o cache do navegador. Aqui o navegador armazena uma cópia local dos recursos solicitados. Isso significa que, se e quando a página da Web for recarregada ou uma página semelhante for carregada que use muito do mesmo conteúdo, esse conteúdo poderá ser servido a partir do cache em vez do servidor da Web. Isso não apenas significa que a página da Web pode carregar mais rápido, mas também reduz a carga na Web servidor e reduz a quantidade de dados que o usuário precisa baixar, o que pode ser importante em conexões.

A própria RAM também atua como um cache de leitura para dados no disco rígido. Nesse caso, os dados de um programa em execução são carregados preventivamente na RAM para que a CPU possa acessá-los mais rapidamente. Os dados da RAM são então armazenados em cache no cache da CPU, embora o processo para isso seja muito mais complexo, pois o cache da CPU é medido em megabytes e não em gigabytes.

Gravar caches

Um cache de gravação é um cache que pode absorver dados sendo gravados em um dispositivo mais lento. Um exemplo comum disso seria o cache SLC em SSDs modernos. Este cache não permite que os dados sejam lidos mais rapidamente, no entanto, é muito mais rápido gravar do que gravar no flash TLC ou QLC que compõe o restante do SSD. O cache SLC pode absorver operações de gravação de alta velocidade e, em seguida, descarrega esses dados assim que possível para o flash TLC, que oferece densidade de armazenamento muito melhor, mas também é muito mais lento para gravar. O uso da memória flash dessa maneira a otimiza tanto para velocidades de gravação rápidas quanto para alta densidade de armazenamento.

Caches híbridos

Há muitas maneiras de lidar com caches que podem permitir que eles atuem como um cache de leitura e gravação. Cada um desses métodos lida com operações de gravação de maneira diferente e apresenta vantagens e desvantagens. As três opções são write-around, write-through e write-back. Um cache write-around ignora completamente o cache durante a gravação, o cache write-through grava no cache, mas só considera a operação concluída quando ela é gravada no armazenamento. O cache de write-back grava no cache e considera a operação concluída, contando com o cache para transferi-lo para o armazenamento, se necessário.

O write-around pode ser útil se você estiver esperando um grande volume de gravações, pois minimiza a rotatividade do cache. No entanto, isso significa que uma operação que lê qualquer um desses dados gravados enfrentará pelo menos um erro de cache na primeira vez. Os caches de gravação armazenam imediatamente em cache as operações de gravação, o que significa que o resultado pode ser servido a partir do cache na primeira vez que for solicitado. No entanto, para ser considerado completo, uma operação de gravação também precisa gravar os dados no disco, o que adiciona latência. Um cache de write-back tem o mesmo benefício que um write-through, permitindo que os dados gravados sejam servidos imediatamente do cache. Não requer operações de gravação para gravar no disco para ser considerado completo. Isso reduz a latência de gravação, mas traz o risco de perda de dados se o cache for volátil e não terminar de gravar os dados de volta no armazenamento antes que a energia seja perdida.

Como remover dados do cache?

Um dos fatores limitantes de qualquer cache é a capacidade. Um cache grande leva muito tempo para pesquisar, negando uma boa parte da vantagem de usar um cache em primeiro lugar. As tecnologias de memória usadas para armazenamento em cache também tendem a ser mais caras do que a memória da qual estão armazenando em cache. Se esse não fosse o caso, é provável que essa camada de memória tivesse trocado as tecnologias de memória para melhorar o desempenho. Esses dois fatores significam que os caches tendem a ser relativamente pequenos, especialmente quando comparados com o meio de armazenamento do qual estão armazenando em cache. A RAM tem menos capacidade que o armazenamento e o cache da CPU tem menos capacidade que a RAM. O cache SLC tem menos capacidade que a memória TLC.

Tudo isso significa que muitas vezes é necessário fazer o ciclo de dados fora do cache para liberar espaço para novos dados que precisam ser armazenados em cache. Há uma variedade de abordagens diferentes para isso. “Usado com menos frequência”, prefere remover entradas de cache que têm a contagem de acesso mais baixa. Isso pode ser útil para prever quais entradas terão o menor efeito em futuras falhas de cache, mas também contaria as entradas adicionadas muito recentemente como tendo um número baixo de acessos, o que pode levar ao cache agitar.

"Menos usado recentemente" prefere remover entradas de cache que não são usadas há algum tempo. Isso pressupõe que eles não estão sendo usados ​​atualmente, mas não leva em consideração se eles foram muito usados ​​há algum tempo. "Usado mais recentemente" prefere remover as entradas de cache usadas mais recentemente, assumindo que elas foram usadas e não precisarão ser usadas novamente. A melhor abordagem geralmente é uma combinação das três, informada pelas estatísticas de uso.

Informações obsoletas e riscos de segurança

O principal risco dos caches é que as informações que eles contêm podem se tornar obsoletas. Uma entrada de cache é considerada obsoleta quando os dados originais foram atualizados deixando a entrada de cache desatualizada. É importante verificar regularmente se a cópia ativa que está sendo veiculada ainda corresponde à cópia em cache.

Em sites especificamente, também é extremamente importante identificar quais dados podem e não podem ser armazenados em cache. Por exemplo, é perfeitamente aceitável que um arquivo JavaScript grande e imutável seja armazenado em cache. Isso evita que o usuário faça o download sempre e pode até beneficiar outros usuários atendidos pelo mesmo cache. No entanto, você não pode armazenar em cache dados específicos da sessão. Imagine o que aconteceria se você navegasse em um aplicativo de mensagens enquanto estivesse conectado como você mesmo, apenas para descobrir que você recebeu uma versão em cache das mensagens de outro usuário. Felizmente, os servidores da Web podem especificar quais recursos podem e não podem ser armazenados em cache e esses problemas são geralmente bem conhecidos, portanto, há poucos problemas como esse.

Conclusão

Um cache é uma parte da memória que pode armazenar alguns dados usados ​​recentemente em um método de armazenamento que é mais rápido de acessar do que seria para concluir o processo normal de acesso a dados novamente. Um cache é normalmente limitado em capacidade, o que significa que ele precisa despejar entradas quando estiver cheio. Os caches geralmente são transparentes para o usuário, o que significa que a latência é a única indicação de que o resultado foi servido por meio de um cache.