mysql - 将持久对象委托(delegate)给 Redis,使用 MySQL 回退

标签 mysql ruby-on-rails ruby-on-rails-3 redis ruby-on-rails-3.2

我有这个想法,我想让一些了解 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 查询的数量,我希望我可以委托(delegate)给 Redis,我认为它可以更快地检索数据。无论回应如何,我都会对此进行基准测试,但无论如何我都很想听听其他人的意见,更重要的是,这种设置在生产中的高事件网站上会完全失败怎么办。

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

谢谢!

更新 Benchmark 的结果是,性能提升似乎可以忽略不计:每 10,000 次查询不到 1 秒:https://gist.github.com/3844026

值得吗?

最佳答案

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

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

这完全不值得。

关于mysql - 将持久对象委托(delegate)给 Redis,使用 MySQL 回退,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12756888/

相关文章:

ruby-on-rails - 自定义路径生成器

mysql - Ruby 循环将事物添加到一起

ruby-on-rails - 设置没有种子数据的数据库

ruby - 在 ruby 中以秒为单位转换时间

sql - 将计算列/虚拟列添加到现有查询

mysql - 如何在 Symfony 和 Doctrine 中连接两个实体?

ruby-on-rails - 谁能推荐一个好的轻量级 Rails CMS?

ruby - 在 Bluehost 上使用 Phusion Passenger 进行 Rails 部署

MySQL:按 DESC 选择唯一 "name"顺序的列表

php - SELECT 语句检索重复结果或仅检索一行