Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.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_Memcached - Fatal编程技术网

Ruby on rails 分页和内存缓存在rails中

Ruby on rails 分页和内存缓存在rails中,ruby-on-rails,memcached,Ruby On Rails,Memcached,使用rails和memcached缓存分页结果集的最佳方法是什么 例如,发布控制器: def index @posts = Rails.cache.fetch('all_posts') do Post.paginate(:conditions => ['xx = ?', yy], :include => [:author], :page => params[:page], :order => 'created_at DESC') end end 当参数[

使用rails和memcached缓存分页结果集的最佳方法是什么

例如,发布控制器

def index
  @posts = Rails.cache.fetch('all_posts') do
    Post.paginate(:conditions => ['xx = ?', yy], :include => [:author], :page => params[:page], :order => 'created_at DESC')
  end
end
参数[:page]
更改时,这显然不起作用。我可以将键更改为
“all_posts#{params[:page]}{params[:order]{last_record.created_at.to_I}”
,但是可能会有几个可能的顺序(最近的、流行的、投票最多的等),并且会有页面和顺序的组合……这样的方式会有很多键

问题#2-当我实施此解决方案时,似乎缓存写入正确,页面在第一次调用分页操作时加载良好。当我使用
recent
顺序单击同一页面(即第1页)时,浏览器甚至没有调用服务器。我看不到正在调用任何控制器操作在生产日志中记录

我使用的是passenger、REE、memcached和rails 2.3.5。Firebug显示没有请求


有没有一种更简单/更优雅的方法来处理这个问题?

当涉及到缓存时,没有简单的解决方案。你可以缓存结果的每一个变量,如果你实现了条目的自动过期,这没关系。你不能只使用所有的帖子,因为如果帖子被更改,你将不得不让几十个键过期

每个AR模型实例都有基于UpDeDeTyAt方法的.cCaseHyKy,这是首选方法,所以使用这个代替最后一个记录。也不要把你的密钥放在最后一个记录上,因为如果中间的某个帖子被删除,你的密钥不会改变。你可以用这样的逻辑来代替。

class ActiveRecord::Base         
  def self.newest
    order("updated_at DESC").first
  end    
  def self.cache_key
    newest.nil? ? "0:0" : "#{newest.cache_key}:#{count}"
  end
end
现在您可以使用Post.cache_键,如果任何帖子被更改/删除或创建,该键将被更改

一般来说,我只是缓存Post.all,然后对这个对象进行分页。你真的需要做一些分析来找出应用程序中的瓶颈

此外,如果您想缓存每个变量,那么可以使用片段/页面缓存

如果由你决定如何缓存和缓存到哪里,这里没有单向缓存


至于问题的第二部分,有一些提示可以让我找到答案。检查浏览器是否正在调用所有LiveHTTPHeaders、tcpdump等。

在缓存方面没有简单的解决方案。您可以缓存结果的每个变量,如果您实现条目的自动过期,这也没关系。您不能使用所有的帖子,因为这样如果帖子被更改,你将不得不终止几十个密钥

每个AR模型实例都有基于UpDeDeTyAt方法的.cCaseHyKy,这是首选方法,所以使用这个代替最后一个记录。也不要把你的密钥放在最后一个记录上,因为如果中间的某个帖子被删除,你的密钥不会改变。你可以用这样的逻辑来代替。

class ActiveRecord::Base         
  def self.newest
    order("updated_at DESC").first
  end    
  def self.cache_key
    newest.nil? ? "0:0" : "#{newest.cache_key}:#{count}"
  end
end
现在您可以使用Post.cache_键,如果任何帖子被更改/删除或创建,该键将被更改

一般来说,我只是缓存Post.all,然后对这个对象进行分页。你真的需要做一些分析来找出应用程序中的瓶颈

此外,如果您想缓存每个变量,那么可以使用片段/页面缓存

如果由你决定如何缓存和缓存到哪里,这里没有单向缓存


至于问题的第二部分,我有一些提示来找到答案。检查浏览器是否正在所有LiveHTTPHeaders、tcpdump等处进行调用。

谢谢。对于第二个问题,我认为另一个问题可能会给你更多提示。出于某种原因,设置了最大年龄,即使我在我的电脑中没有做任何事情rails应用程序,仍在试图理解这个问题。我听说nginx也是一个反向代理,可能与此有关吗?首先是这个“订单(“更新的描述”)方法,该查询会在每次请求传入时运行吗?是的,它会在每次运行,除非您将此方法与另一个缓存方法相结合。但通常没有其他方法可以这样做。您必须通过查看数据库来检查缓存是否有效。但在大多数情况下,这会大大加快速度。谢谢。对于第二个问题,我认为nk另一个问题可能会给你更多提示。出于某种原因,最大年龄正在设置,尽管我在rails应用程序中没有做任何事情,但仍在试图理解这个问题。我听说nginx也是一个反向代理,可能与此有关吗?使用此“订单(“更新描述”)。首先方法,该查询会在每次请求传入时运行吗?是的,它会在每次运行,除非您将此方法与另一个缓存方法结合使用。但通常没有其他方法可以这样做。您必须通过查看数据库来检查缓存是否有效。但在大多数情况下,这会大大加快速度。