Ruby on rails 分页和内存缓存在rails中
使用rails和memcached缓存分页结果集的最佳方法是什么 例如,发布控制器: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 当参数[
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也是一个反向代理,可能与此有关吗?使用此“订单(“更新描述”)。首先方法,该查询会在每次请求传入时运行吗?是的,它会在每次运行,除非您将此方法与另一个缓存方法结合使用。但通常没有其他方法可以这样做。您必须通过查看数据库来检查缓存是否有效。但在大多数情况下,这会大大加快速度。