Estou usando memcached para algum cache em meu aplicativo Rails 3 por meio da Rails.cache
interface simples e agora gostaria de fazer algum processamento de trabalho em segundo plano com redis e resque.
Acho que são diferentes o suficiente para justificar o uso de ambos. No entanto, no heroku, há taxas separadas para usar o memcached e o redis. Faz sentido usar os dois ou devo migrar para apenas usar o redis?
Eu gosto de usar o memcached para armazenamento em cache porque as chaves menos usadas recentemente são automaticamente excluídas do cache e não preciso que os dados do cache persistam. Redis é basicamente novo para mim, mas entendo que é persistente por padrão e que as chaves não expiram do cache automaticamente.
EDIT: Só queria ser mais claro com minha pergunta. Eu sei que é viável usar apenas Redis em vez de ambos. Acho que só quero saber se há alguma desvantagem específica em fazer isso. Considerando a implementação e a infraestrutura, há algum motivo para eu não usar apenas o Redis? (Ou seja, o memcached é mais rápido para cache simples?) Não encontrei nada definitivo de qualquer maneira.
fonte
Respostas:
Supondo que a migração do memcached para o redis para o cache que você já faz seja fácil o suficiente, optaria pelo redis apenas para manter as coisas simples.
No redis, a persistência é opcional, portanto, você pode usá-la de maneira muito semelhante ao memcached, se for o que deseja. Você pode até descobrir que tornar o cache persistente é útil para evitar muitas perdas de cache após uma reinicialização. Expiry também está disponível - o algoritmo é um pouco diferente do memcached, mas não o suficiente para importar para a maioria dos propósitos - veja http://redis.io/commands/expire para detalhes.
fonte
Sou o autor do redis-store , não há necessidade de usar comandos do Redis diretamente, basta usar a
:expires_in
opção como esta:ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes
A vantagem de usar o Redis é a rapidez e, com a minha joia, é que você já tem lojas para
Rack::Cache
,Rails.cache
ouI18n
.fonte
:expires_in
. Você pode ajudar?:expires_in
usando redis_store, consulte stackoverflow.com/questions/20907247/…Eu vi alguns sites grandes de rails que usam Memcached e Redis. Memcached é usado para coisas efêmeras que são boas para manter quentes na memória, mas podem ser perdidas / regeneradas se necessário, e Redis para armazenamento persistente. Ambos são usados para aliviar a carga do banco de dados principal para operações pesadas de leitura / gravação.
Mais detalhes:
Memcached: usado para cache de página / fragmento / resposta e está ok para atingir o limite de memória no Memcached porque ele irá LRU (usado menos recentemente) para expirar o material antigo e frequentemente manter as chaves acessadas ativas na memória. É importante que tudo no Memcached possa ser recriado a partir do banco de dados, se necessário (não é sua única cópia). Mas você pode continuar despejando coisas nele, e o Memcached descobrirá quais são os usados com mais frequência e os manterá ativos na memória. Você não precisa se preocupar em remover coisas do Memcached.
redis: você usa isso para dados que não deseja perder e é pequeno o suficiente para caber na memória. Isso geralmente inclui tarefas resque / sidekiq, contadores para limitação de taxa, resultados de teste de divisão ou qualquer coisa que você não queira perder / recriar. Você não quer exceder o limite de memória aqui, então você deve ser um pouco mais cuidadoso com o que armazena e limpa mais tarde.
O Redis começa a ter problemas de desempenho quando ultrapassa o limite de memória (corrija-me se estiver errado). É possível resolver isso configurando o Redis para agir como Memcached e LRU expirar coisas, de modo que nunca alcance seu limite de memória. Mas você não gostaria de fazer isso com tudo o que mantém no Redis, como recolocar empregos. Então, em vez de as pessoas frequentemente manterem o padrão, Rails.cache definido para usar Memcached (usando o
dalli
gem). E então eles mantêm uma variável global $ redis = ... separada para fazer operações de redis.# in config/application.rb config.cache_store = :dalli_store # memcached # in config/initializers/redis.rb $redis = $redis = Redis.connect(url: ENV['REDIS_URL'])
Pode haver uma maneira fácil de fazer tudo isso no Redis - talvez tendo duas instâncias separadas do Redis, uma com um limite de memória de disco rígido LRU, semelhante ao Memcache, e outra para armazenamento persistente. Eu não vi isso usado, mas acho que seria possível.
fonte
Eu consideraria verificar minha resposta sobre este assunto:
Rails e cache, é fácil alternar entre memcache e redis?
Essencialmente, por meio de minha experiência, eu defenderia mantê-los separados: memcached para cache e redis para estruturas de dados e armazenamento mais persistente
fonte
Perguntei à equipe do Redis Labs (que fornece os complementos Memcached Cloud e Redis Cloud ) sobre qual produto eles recomendariam para o armazenamento em cache do Rails. Eles disseram que, em geral, recomendariam o Redis Cloud, que o Memcached Cloud é oferecido principalmente para fins legados, e apontaram que o serviço do Memcached Cloud é, na verdade, construído sobre o Redis Cloud.
fonte
Não sei para que você os está usando, mas na verdade usar ambos pode lhe dar uma vantagem de desempenho: Memcached tem um desempenho muito melhor rodando em vários núcleos do que Redis, portanto, armazenar em cache os dados mais importantes com Memcached e manter o resto no Redis , tirando proveito de seus recursos como banco de dados, pode aumentar o desempenho.
fonte