开发日志中的许多缓存调用 - 如何防止它们

时间:2016-06-08 17:22:15

标签: ruby-on-rails ruby-on-rails-4

我有一个Rails 4.2应用程序,其中有数百个这样的调用:

  CACHE (0.0ms)  SELECT  "albums".* FROM "albums" WHERE (albumable_type='ItemProfile' and albumable_id=33333)  ORDER BY "albums"."id" ASC LIMIT 1
  CACHE (0.0ms)  SELECT COUNT(*) FROM "assets" WHERE "assets"."album_id" = $1 AND "assets"."is_enabled" = $2  [["album_id", 19182], ["is_enabled", true]]
  CACHE (0.0ms)  SELECT  "albums".* FROM "albums" WHERE (albumable_type='ItemProfile' and albumable_id=33333)  ORDER BY "albums"."id" ASC LIMIT 1
  CACHE (0.0ms)  SELECT  "assets".* FROM "assets" WHERE "assets"."album_id" = $1 AND "assets"."is_enabled" = $2  ORDER BY "assets"."position" ASC LIMIT 1  [["album_id", 19182], ["is_enabled", true]]

两个问题:

  • 这些电话是否真的被发出(我的理解是不是由于“CACHE”)?
  • 有没有办法告诉Rails它已经有这个信息而不需要检查它?好像数百次似乎是我个人的错误

编辑#1

所以问题是有以下内容:

  def instore_image
    album.enabled_assets.first
  end

  def image_600w
    Rails.logger.info("#9797 here is instore_image_url")
    instore_image.asset.url(:fixed_width600)
    Rails.logger.info("#9898 here is instore_image_url")
  end

image_600w正在调用一轮sql调用(无论是否缓存)。似乎要防止这种情况发生我需要在对象上设置一个实例变量。

1 个答案:

答案 0 :(得分:1)

您应该查看Rails指南中的Caching with Rails部分:

  

1.5 SQL缓存

     

查询缓存是一种Rails功能,用于缓存返回的结果集   通过每个查询,以便如果Rails再次遇到相同的查询   该请求,它将使用缓存的结果集而不是运行   再次查询数据库。

因此,这些查询实际上是由您的应用程序进行的,但ActiveRecord会拦截这些查询并通过直接从查询缓存传递来阻止SQL查询。

  

有没有办法告诉Rails它已经有这个信息并且不需要检查它?像数百次似乎在我的最后是一个错误。

是的,Rails已经通过重用缓存的查询结果尽力而为。您可以使用bullet在应用程序中识别N + 1个查询和其他类似的低效数据库使用模式。