1

我有这个想法,我想由一些了解 Redis 和/或 MySQL 的人来运行它,这样你就可以告诉我,即使考虑到这一点,我也很愚蠢。

我想知道将持久对象存储在 Redis 中以供读取会产生什么影响,如果 Redis 键不存在,则回退到数据库数据。为简洁起见,这里有一个(非常)简单的例子来说明我的想法:

class ActiveRecord::Base
  def self.cache_or_query(id)
    Rails.cache.fetch("#{self.name}:#{id}") || begin
      record = self.find(id)
      Rails.cache.write("#{record.class}:#{record.id}", record)
      record
    end
  end
end

person = Person.create(name: "Tom Hanks", email: "thanks@gmail.com")
Person.cache_or_query(person.id) #=> query database, cache gets written, get Person object
Person.cache_or_query(person.id) #=> query Redis, get Person object

然后在 CMS 中,保存记录只会使其缓存过期(或者可能用新数据覆盖它)。

所以,我的问题是:在良好的服务器条件下,Redis 能否胜过 MySQL(或任何数据库)?我的目标是减少在每个页面上执行的 SQL 查询的数量,我希望我可以委托给 Redis,我相信 Redis 可以更快地检索数据。不管反应如何,我都会对此进行基准测试,但无论如何我很想听听其他人的意见,更重要的是,如果这个设置在生产中的高活跃度网站上完全失败,该怎么办。

我承认我不是 MySQL 或 Redis 内部的专家,所以我希望得到一些有见地的答案。

谢谢!

更新Benchmark 的结果是它似乎是一个微不足道的性能提升:每 10,000 次查询不到 1 秒:https ://gist.github.com/3844026

这值得么?

4

1 回答 1

3

MySQL 已经在内存中有它的工作集。当您使用过滤器等进行复杂选择时,您不会从 Redis 获得任何东西。您只会将 Redis 用于单个对象。

此外,ActiveRecord 已经缓存了现有对象的关联......

这完全不值得。

于 2012-10-06T05:42:09.617 回答