2014-03-27 67 views
1

我有两个模型,称为DivisionTier,这些模型被查询了很多,但插入或更新几乎没有做过。这些表只有少量或记录,因此整个表可以存储在内存中。Rails模型缓存

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 ? 

我有几个问题进行了大量的查询

  1. 将在数据库缓存这些表中的内存本身,使另一个缓存解决方案不必要?
  2. 如果不是,有没有什么办法可以在内存中缓存这些模型,并使用除了id以外的条件查询缓存?
  3. 我基本上要求redis/memcached的速度,但关系数据库的功能,这是不可能的?

回答

2

Rails会缓存模式,避免重复DB查找,但只对具有相同的SQL查询,且仅当SQL查询已经在同一个客户端的请求作出。因此可能需要另一个缓存解决方案。

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

  • 正如你指出的那样,你是不是总是ID查询。这意味着你需要缓存给定范围的结果(这似乎是一个糟糕的想法),或者你需要一个缓存,可以通过多个索引执行查找并在一个范围内查找结果(elasticsearch将是这个)。

  • 当您修改数据(INSERT/UPDATE/DELETE)时,缓存可能会过时。范围缓存尤其容易受到这种影响(另一个原因是它不是个好主意),但即使按索引缓存,仍然需要确保相应地更新缓存。