Conceitos
Cache invalidation via leases
Intuição
Imagine um quadro de avisos na sala de reuniões: em vez de alguém correr até lá toda vez que a informação muda para apagar e reescrever o número certo à mão (arriscando escrever a versão errada por cima da certa), a pessoa que atualiza o dado original simplesmente arranca o aviso velho do quadro. Da próxima vez que alguém for olhar o quadro e não encontrar nada, vai até a fonte, pega o valor atual e recoloca um aviso novo. Isso é mais simples e mais seguro do que tentar editar o aviso no lugar, porque editar corre o risco de duas pessoas mexerem ao mesmo tempo e a mais lenta sobrescrever o trabalho da mais rápida.
Como funciona
O Memcache do Facebook usa um cache look-aside: em leitura, a aplicação consulta o memcached e, em caso de miss, busca no banco e grava o resultado de volta no cache; em escrita, a aplicação grava no banco e invalida (deleta) a chave correspondente no cache, em vez de tentar sobrescrever o valor cacheado diretamente. A invalidação é disparada observando as escritas que chegam ao banco (papel do mcsqueal), identificando quais chaves de cache correspondem aos dados alterados e apagando-as de forma direcionada, sem limpar o cache inteiro. Esse desenho evita dois problemas de concorrência em escala: a 'manada de bois' (thundering herd), em que uma chave popular invalidada gera um pico de misses simultâneos correndo para recalcular o mesmo valor no banco; e a escrita atrasada, em que uma requisição antiga que buscou um valor já obsoleto termina de processar depois de uma invalidação e grava dado velho por cima do novo. O mecanismo de lease resolve ambos: ao registrar um miss, o memcached entrega um token de validade limitada ao cliente que vai recalcular o valor no banco; só o cliente com o token válido mais recente tem permissão de escrever o resultado de volta no cache, e escritas com token expirado ou invalidado são descartadas silenciosamente.
Na prática
Esse padrão de invalidar em vez de atualizar diretamente é o default em qualquer arquitetura que combine um banco relacional com Redis ou Memcached na frente para absorver leituras; leases (ou variantes como locks de recomputação com TTL curto) aparecem sempre que uma chave de cache é cara de recalcular e muito acessada, para evitar que um pico de tráfego em uma única chave derrube o banco por trás.
Use em um desenho
Pratique na escola de System Design os casos que dependem deste conceito.