我见过一些同时使用Memcached和Redis的大型Rails网站。Memcached用于短暂的事物,可以很好地保持内存中的热量,但是可以在需要时丢失/重新生成,而Redis用于持久性存储。两者都用于减轻主数据库的负担,以进行繁重的读/写操作。
更多细节:
Memcached:用于页面/片段/响应缓存,可以达到Memcached的内存限制,因为它会LRU(最近最少使用)使旧内容过期,并经常将访问的键保持在内存中。重要的是,如果需要,可以从数据库中重新创建Memcached中的任何内容(这不是您的唯一副本)。但是您可以继续将其转储到其中,Memcached会找出最常使用的内容,并将其保留在内存中。您不必担心从Memcached中删除内容。
redis:将其用于不希望丢失的数据,并且足够小以适合内存。这通常包括resque / sidekiq作业,用于速率限制的计数器,拆分测试结果或您不想丢失/重新创建的任何内容。您不想超出此处的内存限制,因此您在以后存储和清理内容时要多加注意。
一旦Redis超出内存限制,它就会开始出现性能问题(如果我输入错了,请纠正我)。可以通过配置Redis使其像Memcached和LRU过期内容来解决此问题,因此它永远不会达到其内存限制。但是,您不希望对Redis中保留的所有内容(例如,重做作业)执行此操作。因此,Rails.cache设置为使用Memcached(使用dalli
gem),而不是人们通常保留默认值。然后,它们保留一个单独的$ redis = ...全局变量来进行redis操作。
config.cache_store = :dalli_store
$redis = $redis = Redis.connect(url: ENV['REDIS_URL'])
在Redis中可能有一种简单的方法来完成所有这些操作-也许有两个单独的Redis实例,一个实例具有与Memcache类似的LRU硬内存限制,而另一个实例用于持久存储?我还没有看到用过,但是我猜它是可行的。