Redis et Memcache ou juste Redis?

J’utilise memcached pour une mise en cache dans mon application Rails 3 via l’interface simple Rails.cache et maintenant je voudrais faire un travail de traitement en arrière-plan avec redis et resque.

Je pense qu’ils sont assez différents pour justifier l’utilisation des deux. Sur heroku cependant, il y a des frais séparés à utiliser à la fois memcached et redis. Est-il judicieux d’utiliser les deux ou dois-je migrer simplement en utilisant redis?

J’aime utiliser memcached pour la mise en cache, car les clés les plus récemment utilisées sont automatiquement sorties du cache et je n’ai pas besoin de conserver les données du cache. Redis est pour la plupart 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 l’implémentation et de l’infrastructure, existe-t-il des raisons pour lesquelles je ne devrais pas simplement utiliser Redis? (Ie, est memcached plus rapide pour la mise en cache simple?) Je n’ai rien trouvé de définitif de toute façon.

En supposant que la migration de memcached vers redis pour la mise en cache que vous effectuez déjà est assez simple, j’utiliserais uniquement les redis pour garder les choses simples.

Dans Redis, la persistance est facultative, vous pouvez donc l’utiliser comme si vous le vouliez. Vous pouvez même trouver que rendre votre cache persistant est utile pour éviter de nombreux problèmes de cache après un redémarrage. L’expiration est également disponible – l’algorithme est un peu différent de memcached, mais pas suffisamment important pour la plupart des objectives – voir http://redis.io/commands/expire pour plus de détails.

Je suis l’auteur de redis-store , il n’y a pas besoin d’utiliser directement les commandes Redis, il suffit d’utiliser l’option :expires_in comme ceci:

ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes

L’avantage d’utiliser Redis est la rapidité, et avec mon bijou, vous avez déjà des magasins pour Rack::Cache , Rails.cache ou I18n .

J’ai vu quelques grands sites de rails utilisant à la fois Memcached et Redis. Memcached est utilisé pour les choses éphémères qui sont agréables à conserver en mémoire mais peuvent être perdues / régénérées si nécessaire, et Redis pour le stockage persistant. Les deux permettent de décharger la firebase database principale pour la lecture / écriture d’opérations lourdes.

Plus de détails:

Memcached: utilisé pour la mise en cache des pages / fragments / réponses et il est acceptable de dépasser la limite de mémoire de Memcached car il utilisera LRU (moins récemment utilisé) pour expirer les anciens éléments et gardera fréquemment les clés accessibles en mémoire. Il est important que tout élément de Memcached puisse être recréé à partir de la firebase database si nécessaire (ce n’est pas votre seule copie). Mais vous pouvez continuer à y jeter des choses, et Memcached trouvera celles qui sont utilisées le plus fréquemment et gardera celles-ci en mémoire. Vous n’avez pas à vous soucier de supprimer les éléments de Memcached.

redis: vous l’utilisez pour des données que vous ne voudriez pas perdre et est assez petit pour tenir en mémoire. Cela inclut généralement les tâches resque / sidekiq, les compteurs de limitation de débit, les résultats de test fractionnés ou tout ce que vous ne voulez pas perdre ou recréer. Vous ne voulez pas dépasser la limite de mémoire ici, vous devez donc être un peu plus prudent sur ce que vous stockez et nettoyez plus tard.

Redis commence à avoir des 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 s’il s’agissait de Memcached et de l’expiration de LRU, de sorte qu’il n’atteint jamais sa limite de mémoire. Mais vous ne voudriez pas faire cela avec tout ce que vous gardez à Redis, comme des tâches de resque. Ainsi, au lieu de conserver les valeurs par défaut, Rails.cache utilise Memcached (en utilisant le dalli gem). Et puis ils gardent une variable globale $ redis = … pour effectuer les opérations 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 de 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 les modules complémentaires Memcached Cloud et Redis Cloud ) quel produit ils recommanderaient pour la mise en cache Rails. Ils ont déclaré 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 pour quoi vous les utilisez, mais l’utilisation des deux peut vous donner un avantage en termes de performances: Memcached offre de bien meilleures performances sur plusieurs cœurs que Redis. La mise en cache des données les plus importantes avec Memcached et le rest dans Redis , en tirant parti de ses capacités en tant que firebase database, pourrait améliorer les performances.