A principal razão que vejo hoje como um caso de uso para o memcached no Redis é a eficiência de memória superior que você deve conseguir com plain Cache de fragmentos HTML (ou aplicativos semelhantes). Se você precisar armazenar diferentes campos de seus objetos em diferentes chaves do memcached, os hashes do Redis serão mais eficientes em termos de memória, mas quando você tiver um grande número de pares key -> simple_string, o memcached poderá fornecer mais itens por megabyte.
Outras coisas que são pontos positivos sobre o memcached:
- É um código muito simples, então se você só precisa da funcionalidade que ele fornece, acho que é uma alternativa razoável, mas nunca a usei em produção.
- É multissegmentado, portanto, se você precisar dimensionar em uma configuração de caixa única, é bom e você precisa conversar com apenas uma instância.
Acredito que o Redis como cache faz cada vez mais sentido à medida que as pessoas avançam em direção ao cache inteligente ou quando tentam preservar a estrutura dos dados armazenados em cache por meio das estruturas de dados do Redis.
Comparação entre Redis LRU e memcached LRU.
Tanto o memcached quanto o Redis não realizam despejos de LRU reais, mas apenas uma aproximação disso.
O despejo do Memcache é por classe de tamanho e depende dos detalhes de implementação de seu alocador de slab. Por exemplo, se você quiser adicionar um item que se encaixa em uma determinada classe de tamanho, o memcached tentará remover itens expirados / não usados recentemente nessa classe, em vez de tentar uma tentativa global de entender o que é o objeto, independentemente de sua tamanho, que é o melhor candidato.
Em vez disso, o Redis tenta escolher um bom objeto como candidato para remoção quando o
maxmemory
limite é atingido, olhando para todos os objetos, independentemente da classe de tamanho, mas só é capaz de fornecer um objeto aproximadamente bom, não o melhor objeto com o maior tempo ocioso. A maneira como o Redis faz isso é amostrando alguns objetos, escolhendo aquele que ficou ocioso (não acessado) por mais tempo. Desde o Redis 3.0 (atualmente em beta), o algoritmo foi aprimorado e também aceita bons pools de candidatos em remoções, portanto, a aproximação foi aprimorada. Na documentação do Redis você encontra uma descrição e gráficos com detalhes sobre como ele funciona.
Por que o memcached tem uma pegada de memória melhor do que o Redis para mapas de string simples -> string.
O Redis é um software mais complexo, portanto, os valores no Redis são armazenados de maneira mais semelhante a objetos em uma linguagem de programação de alto nível:eles têm tipo, codificação e contagem de referência associados para gerenciamento de memória. Isso torna a estrutura interna do Redis boa e gerenciável, mas tem uma sobrecarga em comparação com o memcached, que lida apenas com strings.
Quando o Redis começa a ser mais eficiente em termos de memória
O Redis é capaz de armazenar pequenos tipos de dados agregados de uma maneira especial de economia de memória. Por exemplo, um pequeno Redis Hash representando um objeto é armazenado internamente não com uma tabela de hash, mas como um blob binário exclusivo. Portanto, definir vários campos por objeto em um hash é mais eficiente do que armazenar N chaves separadas no memcached.
Você pode, na verdade, armazenar um objeto no memcached como um único blob JSON (ou codificado em binário), mas, ao contrário do Redis, isso não permitirá que você busque ou atualize campos independentes.
A vantagem do Redis no contexto do cache inteligente.
Por causa das estruturas de dados do Redis, o padrão usual usado com o memcached de destruir objetos quando o cache é invalidado, para recriá-lo a partir do banco de dados posteriormente, é uma maneira primitiva de usar o Redis.
Por exemplo, imagine que você precisa armazenar em cache as últimas N notícias postadas no Hacker News para preencher a seção "Mais recente" do site. O que você faz com o Redis é pegar uma lista (limitada a M itens) com as notícias mais recentes inseridas. Se você usa outro armazenamento para seus dados e o Redis como cache, o que você faz é preencher ambos as visualizações (Redis e DB) quando um novo item é postado. Não há invalidação de cache.
No entanto, o aplicativo sempre pode ter lógica para que, se a lista Redis estiver vazia, por exemplo, após uma inicialização, a visualização inicial possa ser recriada a partir do banco de dados.
Ao usar o cache inteligente é possível realizar o cache com o Redis de forma mais eficiente em relação ao memcached, mas nem todos os problemas são adequados para esse padrão. Por exemplo, o cache de fragmentos HTML pode não se beneficiar dessa técnica.