我在Rails3应用程序中通过简单的Rails.cache
接口使用memcached进行一些缓存,现在我想用redis和resque做一些后台作业处理。
我认为它们的不同足以保证两者都用。不过在heroku上,memcached和redis是分开收费的。两者都用有意义吗?或者我应该迁移到只使用redis?
我喜欢使用memcached进行缓存,因为最近最少使用的键会自动从该高速缓存中推出,我不需要缓存数据持久化。Redis对我来说基本上是新的,但我知道它默认是持久的,并且密钥不会自动从该高速缓存中过期。
答:我只是想更清楚地回答你的问题。我知道只使用Redis而不是两者都使用是可行的。我想我只是想知道这样做是否有任何具体的缺点?考虑到实现和基础设施,有什么理由不应该只使用Redis吗?(即,memcached对于简单缓存是否更快?)我还没有找到任何明确的方式。
6条答案
按热度按时间woobm2wo1#
假设从memcached迁移到redis的缓存已经足够简单,那么我选择redis只是为了保持简单。
在redis中,持久性是可选的,所以如果你想要的话,你可以像memcached一样使用它。您甚至可能会发现,使缓存持久化有助于避免重启后出现大量缓存未命中。过期也是可用的-算法与memcached有点不同,但对于大多数用途来说还不够重要-有关详细信息,请参阅http://redis.io/commands/expire。
9rnv2umw2#
我是redis-store的作者,没有必要直接使用Redis命令,只需要像这样使用
:expires_in
选项:ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes
个使用Redis的优点是快速,而我的宝石,是你已经有
Rack::Cache
,Rails.cache
或I18n
的商店。k3bvogb13#
我见过一些大型的Rails站点同时使用Memcached和Redis。Memcached用于短暂的东西,这些东西很好地保持在内存中,但如果需要,可以丢失/重新生成,而Redis用于持久存储。两者都用于为阅读/写繁重的操作减轻主DB的负载。
更多详情:
**Memcached:**用于页面/片段/响应缓存,在Memcached上达到内存限制是可以的,因为它会LRU(最近最少使用)使旧的东西过期,并经常在内存中保持访问的键热。重要的是,如果需要,可以从DB中重新创建Memcached中的任何内容(它不是您唯一的副本)。但是你可以不断地把东西转储到它里面,Memcached会找出哪些是最常用的,并把它们保存在内存中。您不必担心从Memcached中删除内容。
**redis:**你使用它来保存你不想丢失的数据,并且它足够小,可以放入内存。这通常包括resque/sidekiq作业、速率限制计数器、分割测试结果或任何您不希望丢失/重新创建的内容。您不希望在这里超出内存限制,因此必须更加小心地存储和稍后清理内容。
一旦超过内存限制,Redis就开始出现性能问题(如果我错了,请纠正我)。可以通过配置Redis来解决这个问题,使其像Memcached和LRU过期一样,这样它就永远不会达到内存限制。但是你不想对Redis中的所有东西都这样做,比如重新定制的工作。因此,人们通常保留默认值,Rails.cache设置为使用Memcached(使用
dalli
gem)。然后他们保持一个单独的$redis =...全局变量来执行redis操作。字符串
在Redis中可能有一个简单的方法来完成这一切--也许是通过两个独立的Redis示例,一个具有LRU硬内存限制,类似于Memcache,另一个用于持久存储?我还没有看到这个使用,但我猜这将是可行的。
j91ykkif4#
我想看看我对这个问题的回答:
Rails和缓存,在memcache和redis之间切换容易吗?
从本质上讲,根据我的经验,我主张将它们分开:memcached用于缓存,redis用于数据结构和更持久的存储
vh0rcniy5#
我问了Redis团队(他们提供Memcached Cloud和Redis Cloud插件),他们会推荐哪种产品用于Rails缓存。他们说,一般来说,他们会推荐Redis Cloud,Memcached Cloud主要用于传统目的,并指出他们的Memcached Cloud服务实际上是建立在Redis Cloud之上的。
ac1kyiln6#
我不知道你在用它们做什么,但实际上两者都用可能会给你带来性能优势:与Redis相比,Memcached在多核运行时的性能要好得多,因此使用Memcached缓存最重要的数据,并将其余数据保存在Redis中,利用其数据库功能,可以提高性能。