# Memcached

Em computação, memcached é um sistema distribuído de cache em memória de propósitos gerais. É frequentemente utilizado para acelerar sites dinâmicos orientados a banco de dados, cacheando dados e objetos na RAM para reduzir o número de vezes que uma fonte de dados externa (como um banco de dados ou uma API) deve ser acessada. Foi originalmente desenvolvido pela Danga Interactive para o LiveJournal, mas é usado agora para muitos outros sites. O Memcached roda em Unix, Linux, Windows e Mac OS X e é distribuído sobre a licença Revised BSD license.
A API do memcached provê uma hash table gigante distribuída em múltiplas máquinas. Quando a tabela está cheia, inserções subsequentes fazem com que os dados antigos sejam expurgados em least recently used (LRU) order. Aplicações usando memcached tipicamente colocam requests e adições em RAM antes de recorrer a armazenamentos mais lentos, como bancos de dados.
O sistema é usado em sites incluindo o YouTube Reddit, Zynga, Facebook, Orange, Twitter e Wikipedia. Engine Yard está usando o memcached como parte de sua stack tecnológica de platform as a service e o Heroku oferece um serviço de memcached administrado no seu Couchbase Server como parte de seu serviço de plataforma como serviço. Google App Engine, AppScale, Windows Azure e Amazon Web Services também oferecem um serviço de memcached através de uma API.

## História

O memcached foi desenvolvido inicialmente por Brad Fitzpatrick para seu site, LiveJournal, em 22 de Maio de 2003.

## Arquitetura

O sistema usa uma arquitetura cliente-servidor. O servidor mantem um array associativo chave-valor; o cliente popula esse array e consulta-o. Chaves podem ter até 250 bytes e os valores podem ter no máximo 1MB (megabyte) de tamanho.
Clientes usam bibliotecas client-side para contactar os servidores que por padrão expõe seus serviços na porta 11211. Cada cliente conhece todos os servidores, esses não se comunicam entre si. Se um cliente deseja setar ou ler o valor correspondente a uma chave, a biblioteca cliente primeiramente computa o hash da chave para determinar qual servidor usar. Então ele contacta o servidor. O servidor então computa um segundo hash da chave para determinar onde armazenar ou ler o valor correspondente.
O servidor mantém os valores em RAM. Se um servidor fica sem memória livre, ele descarta os valores mais antigos. Portanto, os clientes devem tratar o memcached como um cache transitório. Eles não devem contar com que os dados armazenados no memcached ainda estarão lá quando ele precisarem. MemcacheDB, Couchbase Server, Tarantool e outros bancos de dados proveem armazenamento persistente enquanto mantém a compatibilidade com o protocolo do memcached.
Se todas as bibliotecas client usam o mesmo algoritmo de hash para determinar o servidores, então os clientes pode ler os dados cacheados um dos outros. Isso é obviamente desejável.
Uma implementação típica terá vários servidores e muitos clientes. Porém é possível usar o memcached em um único computador, agindo como cliente e servidor.

### Segurança

A maioria das implantações do memcached estão dentro de uma rede confiável onde os clientes podem se conectar livremente a qualquer servidor. Há casos, contudo, em que o memcached é implementado em uma rede não confiável ou quando os administradores gostariam de exercitar controle sobre os clientes que estão conectando.
Uma apresentação na BlackHat USA 2010 revelou que um grande número de grande sites públicos deixaram seus memcached abertos para inspeção, análise, obtenção e modificação de dados.