我有这个想法,我想让一些了解 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/