J'utilise memcached pour une certaine mise en cache dans mon Rails 3 application via le simple Rails.cache
interface et maintenant je voudrais faire un traitement de tâche en arrière-plan avec redis et resque.
Je pense qu'ils sont suffisamment différents pour justifier l'utilisation des deux. Sur heroku cependant, il y a des frais distincts pour utiliser à la fois memcached et redis. Est-il judicieux d'utiliser les deux ou dois-je migrer vers simplement en utilisant redis?
J'aime utiliser memcached pour la mise en cache car les clés les moins récemment utilisées sont automatiquement expulsées du cache et je n'ai pas besoin que les données du cache persistent. Redis est principalement nouveau pour moi, mais je comprends qu'il est persistant par défaut et que les clés n'expirent pas automatiquement du cache.
EDIT: Je voulais juste être plus clair avec ma question. Je sais qu'il est possible d'utiliser uniquement Redis au lieu des deux. Je suppose que je veux juste savoir s'il y a des inconvénients spécifiques à le faire? Compte tenu de la mise en œuvre et de l'infrastructure, y a-t-il des raisons pour lesquelles je ne devrais pas simplement utiliser Redis? (Par exemple, memcached est-il plus rapide pour une mise en cache simple?) Je n'ai rien trouvé de définitif dans les deux cas.
En supposant que la migration de memcached vers redis pour la mise en cache que vous faites déjà soit assez facile, j'irais avec redis uniquement pour garder les choses simples.
Dans redis, la persistance est facultative, vous pouvez donc l'utiliser un peu comme memcached si c'est ce que vous voulez. Vous pouvez même constater que rendre votre cache persistant est utile pour éviter de nombreux échecs de cache après un redémarrage. Expiration est également disponible - l'algorithme est un peu différent de memcached, mais pas suffisant pour la plupart des usages - voir http://redis.io/commands/expire pour plus de détails.
Je suis l'auteur de redis-store , il n'est pas nécessaire d'utiliser directement les commandes Redis, utilisez simplement le :expires_in
option comme celle-ci:
ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes
L'avantage d'utiliser Redis est la rapidité, et avec mon bijou, c'est que vous avez déjà des magasins pour Rack::Cache
, Rails.cache
ou I18n
.
J'ai vu quelques grands sites Rails qui utilisent à la fois Memcached et Redis. Memcached est utilisé pour des choses éphémères qui sont agréables à garder au chaud en mémoire mais peuvent être perdues/régénérées si nécessaire, et Redis pour le stockage persistant. Les deux sont utilisés pour décharger la base de données principale pour les opérations lourdes de lecture/écriture.
Plus de détails:
Memcached: utilisé pour la mise en cache des pages/fragments/réponses et il est correct d'atteindre la limite de mémoire sur Memcached car il LRU (le moins récemment utilisé) pour expirer les anciens trucs et garder fréquemment les clés accédées chaudes en mémoire . Il est important que tout ce qui se trouve dans Memcached puisse être recréé à partir de la base de données si nécessaire (ce n'est pas votre seule copie). Mais vous pouvez continuer à y jeter des objets, et Memcached trouvera ceux qui sont utilisés le plus fréquemment et gardera ceux-ci en mémoire. Vous n'avez pas à vous soucier de supprimer des éléments de Memcached.
redis: vous l'utilisez pour des données que vous ne voudriez pas perdre, et elle est suffisamment petite pour tenir en mémoire. Cela inclut généralement les travaux de resque/sidekiq, les compteurs de limitation de débit, les résultats des tests fractionnés ou tout ce que vous ne voudriez pas perdre/recréer. Vous ne voulez pas dépasser la limite de mémoire ici, vous devez donc faire un peu plus attention à ce que vous stockez et nettoyez plus tard.
Redis commence à souffrir de problèmes de performances une fois qu'il dépasse sa limite de mémoire (corrigez-moi si je me trompe). Il est possible de résoudre ce problème en configurant Redis pour qu'il agisse comme des éléments expirant Memcached et LRU, afin qu'il n'atteigne jamais sa limite de mémoire. Mais vous ne voudriez pas faire cela avec tout ce que vous gardez à Redis, comme les emplois de reprise. Donc, au lieu de garder souvent la valeur par défaut, Rails.cache est configuré pour utiliser Memcached (en utilisant la gemme dalli
). Et puis ils gardent une variable globale $ redis = ... distincte pour effectuer les opérations 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'])
Il pourrait y avoir un moyen facile de tout faire dans Redis - peut-être en ayant deux instances Redis distinctes, l'une avec une limite de mémoire dure LRU, similaire à Memcache, et une autre pour le stockage persistant? Je n'ai pas vu cela utilisé, mais je suppose que ce serait faisable.
J'envisagerais de vérifier ma réponse à ce sujet:
Rails et mise en cache, est-il facile de basculer entre memcache et redis?
Essentiellement, grâce à mon expérience, je préconiserais de les garder séparés: memcached pour la mise en cache et redis pour les structures de données et un stockage plus persistant
J'ai demandé à l'équipe de Redis Labs (qui fournit le Cloud Memcached et Redis Cloud modules complémentaires) sur quel produit ils recommanderaient pour la mise en cache Rails. Ils ont dit qu'en général ils recommanderaient Redis Cloud, que Memcached Cloud est principalement proposé à des fins héritées, et ont souligné que leur service Memcached Cloud est en fait basé sur Redis Cloud.
Je ne sais pas pourquoi vous les utilisez, mais en fait, les deux peuvent vous offrir un avantage en termes de performances: Memcached a de bien meilleures performances sur plusieurs cœurs que Redis, donc la mise en cache des données les plus importantes avec Memcached et le reste dans Redis , tirant parti de ses capacités de base de données, pourrait augmenter les performances.