Redis 和 Memcache 还是只是 Redis?

Posted

技术标签:

【中文标题】Redis 和 Memcache 还是只是 Redis?【英文标题】:Redis and Memcache or just Redis? 【发布时间】:2011-05-10 11:19:30 【问题描述】:

我正在通过简单的Rails.cache 接口在我的 Rails 3 应用程序中使用 memcached 进行一些缓存,现在我想使用 redis 和 resque 进行一些后台作业处理。

我认为它们的不同之处足以保证两者都使用。不过,在 heroku 上,使用 memcached 和 redis 需要单独付费。两者都使用是否有意义,还是应该迁移到仅使用 redis?

我喜欢使用 memcached 进行缓存,因为最近最少使用的键会自动从缓存中推出,我不需要缓存数据来保存。 Redis 对我来说大多是新的,但我知道它默认是持久的,并且密钥不会自动过期。

编辑:只是想更清楚我的问题。我知道只使用 Redis 而不是两者都是可行的。我想我只是想知道这样做是否有任何特定的缺点?考虑到实现和基础设施,我有什么理由不应该只使用 Redis? (即,对于简单缓存,memcached 是否更快?)我还没有找到任何确定的方法。

【问题讨论】:

对于其他考虑这一点的人:有一个用于 rails 的 redis-store 插件,可让您将 redis 用作缓存存储。 【参考方案1】:

假设从 memcached 迁移到 redis 以进行您已经做的缓存很容易,我会选择 redis 只是为了让事情变得简单。

在 redis 中,持久化是可选的,所以如果你想要的话,你可以像 memcached 一样使用它。您甚至可能会发现使缓存持久化对于避免重启后大量缓存未命中很有用。到期也可用 - 该算法与 memcached 有点不同,但对于大多数用途来说还不够重要 - 请参阅 http://redis.io/commands/expire 了解详细信息。

【讨论】:

感谢您的回答和相关文档。我稍微编辑了我的问题,以更清楚地说明我在寻找什么。我没有考虑重启后的缓存持久性......这是一个很好的功能。 (虽然我不确定考虑到我将使用 redis 与 heroku 一起使用它有多大用处。) 如果你想保留一些临时的项目(片段缓存)和一些项目在redis中持久化,你需要创建两个独立的redis实例吗? 虽然我们将 Redis 用于作业队列和缓存,但出于 @BrianArmstrong 所述的具体原因,我们使用不同的配置运行它们。缓存是短暂的,因此我们将其配置为快速,但可以在内存中丢失内容并丢弃 LRU。对于队列,我们​​真的不想丢失工作,所以我们将其配置为持久化,以便它可以恢复。 @jwadsa​​ck 你有帖子展示你是如何实现这个配置的吗? @Marklar 好主意。我现在做:ballardhack.wordpress.com/2015/09/30/…【参考方案2】:

我是redis-store的作者,不需要直接使用Redis命令,直接使用:expires_in这个选项即可:

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

使用 Redis 的优点是速度快,而我的 gem 是,您已经拥有 Rack::CacheRails.cacheI18n 的商店。

【讨论】:

感谢卢卡的回复。我假设您可以在需要持久存储某些内容时直接覆盖 :expires_in ?我猜这个问题实际上是关于同时使用 memcached 类型功能 使用 redis 作为持久存储。 我认为同时拥有 memcached 和 redis 没有意义,因为它们位于同一个 NoSQL 段中:两者都是 k/v 存储。 Redis 优点:1. 比 memcached 快 2. 更强大的命令 3. 不需要缓存预热 4. 有助于解决其他问题(例如,使用 Resque 的队列) 缺点:1. 你需要一个外部 gem 2. 重启后,服务器从附加文件 Memcached 读取数据时不接受命令 优点:在 Rails 中烘焙 缺点:1. 比 Redis 慢 2. 缓存预热。 @LucaGuidi 我目前正在使用 RedisStore 作为我的 Rails 缓存。我不知道如何设置 Redis URL 默认的:expires_in。你能帮忙吗? 像我一样,如果您在使用 redis_store 设置 :expires_in 时遇到问题,请参考 ***.com/questions/20907247/…【参考方案3】:

我见过一些同时使用 Memcached 和 Redis 的大型 Rails 站点。 Memcached 用于短暂的事物,这些事物可以很好地在内存中保持热,但如果需要可以丢失/重新生成,Redis 用于持久存储。两者都用于减轻主数据库的负载以进行繁重的读/写操作。

更多细节:

Memcached: 用于页面/片段/响应缓存,可以达到 Memcached 的内存限制,因为它将 LRU(最近最少使用)使旧的东西过期,并经常保留访问的键记忆中的炽热。如果需要,可以从数据库中重新创建 Memcached 中的任何内容(这不是您唯一的副本),这一点很重要。但是你可以继续往里面倾倒东西,Memcached 会找出最常使用的东西,并将那些热的东西保存在内存中。您不必担心从 Memcached 中删除内容。

redis:您将它用于您不想丢失的数据,并且足够小以适合内存。这通常包括 resque/sidekiq 作业、速率限制计数器、拆分测试结果或您不想丢失/重新创建的任何内容。您不想超出此处的内存限制,因此您必须更加小心存储和稍后清理的内容。

一旦超过内存限制,Redis 就会开始出现性能问题(如果我错了,请纠正我)。可以通过将 Redis 配置为像 Memcached 和 LRU 过期的东西一样来解决这个问题,因此它永远不会达到其内存限制。但是你不会想用你保存在 Redis 中的所有东西来做这个,比如 resque 工作。因此,人们通常不会保留默认设置,而是将 Rails.cache 设置为使用 Memcached(使用 dalli gem)。然后他们保留一个单独的 $redis = ... 全局变量来进行 redis 操作。

# in config/application.rb
config.cache_store = :dalli_store  # memcached

# in config/initializers/redis.rb
$redis = $redis = Redis.connect(url: ENV['REDIS_URL'])

在 Redis 中可能有一种简单的方法来完成这一切 - 也许通过拥有两个独立的 Redis 实例,一个具有 LRU 硬内存限制,类似于 Memcache,另一个用于持久存储?我还没有看到这个使用过,但我猜它是可行的。

【讨论】:

【参考方案4】:

我会考虑查看我对这个问题的回答:

Rails and caching, is it easy to switch between memcache and redis?

基本上,根据我的经验,我主张将它们分开:memcached 用于缓存,redis 用于数据结构和更持久的存储

【讨论】:

虽然我最初计划根据我的问题的原始答案来整合它们,但我后来得出了基本相同的结论。我使用 memcache 进行基本缓存,使用 redis 进行 resque。【参考方案5】:

我向Redis Labs 的团队(他们提供Memcached CloudRedis Cloud 附加组件)询问他们会推荐哪种产品用于Rails 缓存。他们表示一般会推荐 Redis Cloud,Memcached Cloud 主要用于遗留用途,并指出他们的 Memcached Cloud 服务实际上是建立在 Redis Cloud 之上的。

【讨论】:

所以不需要Brian的回答中提到的memcached和redis? “人们经常将默认的 Rails.cache 设置为使用 memcached(使用 dalli gem)。然后他们保留一个单独的 $redis = ... 全局变量来执行 redis 操作。”【参考方案6】:

我不知道您使用它们的目的,但实际上同时使用它们可能会给您带来性能优势:Memcached 在多核上运行的性能比 Redis 好得多,因此使用 Memcached 缓存最重要的数据并保留在 Redis 中休息,利用其作为数据库的功能,可以提高性能。

【讨论】:

这并不完全正确 - redis 使用多个实例而不是多个线程,因此将单核 redis 实例与多核 memcached 实例进行比较并不是一个特别相关的测试。此外,如果有可用的基准测试表明两个系统都是最快的,那么这种差异在现实世界中就不太重要了。 redis 的多进程方法在多核系统上的扩展性比 memcached 多线程的(默认)方法更好:antirez.com/post/update-on-memcached-redis-benchmark.html Redis 的这个主要缺点确实被淡化了很多。如果你追求高并发,多核,Memcached 可以绕着 Redis 跑一圈。分片不是一个好的解决方案,因为您必须在应用程序中实现一致的哈希,并且您不会在 Redis 实例之间获得完美的分布。例如,如果分片 A 缓存了您的应用程序在每个请求中使用的配置,那么分片 A 将获得比每个请求都未命中的其他分片更多的请求。

以上是关于Redis 和 Memcache 还是只是 Redis?的主要内容,如果未能解决你的问题,请参考以下文章

memcache 和 redis 的区别

选redis还是memcache,源码怎么说

安装NoSQL数据库类型的redis 和 memcache数据库

PHP开发APP接口

memcache、memcached和redis的区别

redis 和 memcache 的区别