Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails模型缓存_Ruby On Rails_Ruby_Postgresql_Caching - Fatal编程技术网

Ruby on rails Rails模型缓存

Ruby on rails Rails模型缓存,ruby-on-rails,ruby,postgresql,caching,Ruby On Rails,Ruby,Postgresql,Caching,我有两个模型,称为部门和层,它们被查询了很多次,但很少进行插入或更新。这些表中只有少量的或记录,因此整个表都可以存储在内存中 class Division # position: integer belongs_to :tier end class Tier # name: string has_many :tiers end 几乎每个页面都会查询这些表,所以这看起来像是浪费数据库调用 模型缓存解决方案(如在memcached中缓存记录)只允许您按id从缓存中检索记录 很多查

我有两个模型,称为
部门
,它们被查询了很多次,但很少进行插入或更新。这些表中只有少量的或记录,因此整个表都可以存储在内存中

class Division
  # position: integer
  belongs_to :tier
end

class Tier
  # name: string
  has_many :tiers
end
几乎每个页面都会查询这些表,所以这看起来像是浪费数据库调用

模型缓存解决方案(如在memcached中缓存记录)只允许您按id从缓存中检索记录

很多查询只是按id进行选择,但我也执行了很多查询,如

SELECT * FROM divisions WHERE divisions.position BETWEEN ? AND ?
我有几个问题

  • 数据库是否会自己将这些表缓存在内存中,从而不需要另一个缓存解决方案
  • 如果没有,是否有办法将这些模型缓存在内存中,并使用id以外的条件查询缓存
  • 从本质上说,我是在要求具有redis/memcached的速度,但关系数据库的功能,而这是不可能的吗

  • Rails将缓存模型并避免重复的DB查找,但仅适用于相同的SQL查询,并且仅当该SQL查询已在同一客户机请求中进行时。因此,可能需要另一种缓存解决方案

    对于您的情况(非易失性的参考数据),缓存听起来是个好主意。但是,有几个注意事项:

    • 正如您所指出的,您并不总是按id进行查询。这意味着您要么需要缓存给定范围的结果(这似乎是个坏主意),要么需要一个可以通过多个索引执行查找并跨范围查找结果的缓存(
      elasticsearch
      就是一个很好的例子)

    • 修改数据(插入/更新/删除)时,缓存可能会过时。范围缓存特别容易受到此攻击(这是一个坏主意的另一个原因),但即使按索引缓存,也需要确保相应地更新缓存