我有两个模型,称为 Division
和 Tier
,它们经常被查询,但几乎没有插入或更新。表中只有少数或记录,因此可以将整个表存储在内存中。
class Division
# position: integer
belongs_to :tier
end
class Tier
# name: string
has_many :tiers
end
几乎每个页面都要查询这些表,所以看起来很浪费数据库调用
模型缓存解决方案,如 identity cache ,在memcached中缓存记录,只允许您通过id从缓存中检索记录。
很多查询只是通过id选择,但我也执行了很多查询,比如
SELECT * FROM divisions WHERE divisions.position BETWEEN ? AND ?
我有几个问题
- 数据库是否会自行将这些表缓存在内存中,从而无需另一种缓存解决方案?
- 如果没有,是否有任何方法可以将这些模型缓存在内存中,并使用 id 以外的条件查询缓存?
- 我本质上是不是要求的东西具有 redis/memcached 的速度,但是关系数据库的功能,这是不可能的?
最佳答案
Rails 将缓存模型并避免重复的数据库查找,但仅适用于相同的 SQL 查询,并且仅当该 SQL 查询已经在相同的客户端请求中。因此可能需要另一种缓存解决方案。
对于您的情况(非 volatile 引用数据),缓存听起来是个好主意。但是,有几点需要注意:
正如您所指出的,您并不总是通过 ID 进行查询。这意味着您要么需要缓存给定范围的结果(这似乎是个坏主意),要么您需要一个可以通过多个索引执行查找并在一个范围内查找结果的缓存(
elasticsearch
就是一个很好的例子)。当您修改数据(插入/更新/删除)时,缓存可能会过时。范围缓存特别容易受到此影响(这是一个坏主意的另一个原因),但即使您按索引缓存,您仍然需要确保相应地更新缓存。
关于ruby-on-rails - Rails 模型缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22697809/