Tag: 缓存

rails + ActiveRecord:缓存模型的所有寄存器

我有一个小模型(让我们称之为“节点”)代表树状结构。 每个节点只包含一个名称和对其父亲的引用: class Node < ActiveRecord::Base validates_presence_of :name, :parent_id end 表格不是很大 – 少于100个元素。 它很少更新 – 在过去4个月中,网站管理员一次添加了20个新元素。 然而,它在我的应用程序中使用了很多。 鉴于其树状结构,在某些情况下,请求会触发超过30个数据库命中(包括ajax调用,我使用了很多)。 我想使用某种缓存来降低数据库访问 – 因为表太小了,我想到缓存内存中的所有寄存器。 这可能是轨道2.3吗? 有没有更好的方法来处理这个?

使用perform_caching防止缓存未命中警告

我正在试验我的Rails 3.2应用程序中的缓存,并通过将其添加到我的development.rb文件中启用缓存: config.action_controller.perform_caching = true 缓存按预期工作,除了当我加载任何页面时,控制台显示大量这些日志条目: Completed 200 OK in 1006ms (Views: 249.2ms) cache: [GET /assets/jquery_ujs.js?body=1] miss cache: [GET /assets/chosen.jquery.min.js?body=1] miss cache: [GET /assets/bootstrap/bootstrap-tooltip.js?body=1] miss cache: [GET /assets/bootstrap/tabs.js?body=1] miss cache: [GET /assets/jquery-ui.js?body=1] miss cache: [GET /assets/jquery.notifications-1.1.js?body=1] miss cache: [GET /assets/jquery.js?body=1] miss cache: [GET /assets/jquery.tablesorter.min.js?body=1] miss cache: [GET /assets/spin.js?body=1] miss cache: [GET /assets/olark.js?body=1] miss cache: [GET […]

当memcached中有命中时,如何让caches_action设置expires头?

我有一个缓存使用的动作 caches_action :my_action, :expires_in=>1.hours 并使用在动作本身设置过期标题 def my_action … expires_in 1.hours send_data(…,:disposition => ‘inline’,:type => ‘image/png’,:filename => params[:title]+”.png”) end 但是,当我查看来自memcached命中结果的结果的缓存控制响应头时,我得到: Cache-Control: private, max-age=0, must-revalidate 第一轮,即当缓存中没有任何内容时,它就是我所期望的,即: Cache-Control: max-age=3600, private 看起来rails + memcached既不缓存原始响应头,也不设置适当的头本身。 结果是,即使结果(图像)没有改变,客户端每次都向服务器发出请求。 尽管该操作在缓存中受到快速响应时很快就会完成,但它仍然会再次发送所有数据,这是我想避免的。 如何让标题做正确的事情,以便客户端首先不发出请求,或者获得“未修改”的响应?

如果Redis关闭,则禁用Rails缓存

我正在使用Rails 4.1并设置共享Redis ElasticCache节点进行缓存。 我尝试了https://github.com/redis-store/redis-store和https://github.com/sorentwo/readthis ,看起来很棒。 但是如果Redis失败会怎么样? readthis和redis-store都完全失败了。 我宁愿让网站缓慢无缓存而不是死机。 有没有人有想法? 我提前谢谢你。

rails – 使用Rails.cache会出错

我正在尝试缓存一个昂贵的查询,该查询在Rails 3中的整个站点中的多个请求中重用。 当用户单击表格以查看报告或用户单击以查看地图或用户单击以打印某些内容时,将执行以下查询: reports.where{(time > my{range.begin}) & (time < my{range.end})} 这是一个昂贵的查询,可以产生数千条记录。 我想缓存它,所以在第一次调用它之后,它被存储在缓存中,直到查询中的一个记录被修改(例如更新)。 我用这个替换我的查询: Rails.cache.fetch(‘time_reports’) { reports.where{(time > my{range.begin}) & (time < my{range.end})} } 但它提出了一个例外: TypeError (can’t dump anonymous class #): 作为问题的一部分,我想知道使用Rails.cache.fetch是否还要求我在config / environments / production.rb中添加以下内容: config.cache_store = :mem_cache_store, “cache-1.example.com”, “cache-2.example.com” //obviously I would use my ip

Rails4:模型缓存(低级缓存)

我正在尝试缓存Active Record Query的结果。 这是我的用例: User.rb def self.awesome_users_cached Rails.cache.fetch(“awesome_users”) { where(awesome: true) } end UsersController def index all_awesome_users = User.awesome_users_cached less_awesome_users = User.where(less_awesome_user:true).pluck(:id) @users = all_awesome_users.where.not(id: less_awesome_users) end 这是2个问题: self.awesome_users_cached不会缓存结果并最终命中 all_awesome_users最终成为一个数组而不是活动Record,因此我无法从中过滤掉less_awesome_users。 有一个解决方案似乎不再适用于Rails4: Rails缓存与where子句

Rails:查询缓存缓存默认范围?

我有一个像这样的默认范围是动态的: default_scope :conditions => [“departure_date >= ?”, DateTime.current.beginning_of_day] 当我使用这段代码时,第一天就可以了。 让我们说第一天是28-03-2011 但第二天似乎还在使用”departure_date >= 28-03-2011″ 我的默认范围是否被缓存?

如何在rails中使用多个缓存?

我有一个rails应用程序,我想同时使用memcached和文件存储缓存,用于不同的目的。 我想使用文件存储缓存来保留大量不经常更改的页面(有些根本不会更改) – 即页面缓存 – 并使用memcached进行其他操作(操作和数据库缓存等)。 原因是存储在文件存储缓存中的页面可能需要大量存储空间,但是大多数页面都不经常访问。 这是可能的,还是将memcached配置为缓存意味着它还用于页面缓存? 作为第二个问题,在某种forms的cron作业中从文件存储缓存中删除页面的安全方法是什么,因为似乎没有为此缓存指定ttl的选项。 例如,UNIX查找命令可以快速查找并删除长时间未访问过的所有旧页面或页面 – 如果应用程序服务器可能尝试在此时为其中一个页面提供服务,这样做是否安全(tho)这是不太可能的)? 如果没有,那么最好的方法是什么。

如何使用Heroku上的机架/缓存来缓存超过1MB的文件?

我正在使用Heroku上托管的Dragonfly和rack / cache的组合。 我正在使用Dragonfly上传资产。 缩略图即时处理并存储在机架/缓存中,以便从memcached(通过Memcachier插件 )快速传送。 常规静态资产也通过机架/缓存缓存在memcached中。 我的问题是,任何超过1MB的上传文件都会导致我的应用程序出现500错误。 2013-07-15T10:38:27.040992+00:00 app[web.1]: DalliError: Value too large, memcached can only store 1048576 bytes per key [key: d49c36d5db74ef45e957cf169a0b27b83b9e84de, size: 1502314] 2013-07-15T10:38:27.052255+00:00 app[web.1]: cache: [GET /media/BAhbBlsHOgZmSSIdNTA3Njk3ZWFiODBmNDEwMDEzMDAzNjA4BjoGRVQ/WTW_A5Flyer_HealthcareMedicalObsGynae_WEB.pdf] miss, store 2013-07-15T10:38:27.060583+00:00 app[web.1]: !! Unexpected error while processing request: undefined method `each’ for nil:NilClass Memcache有1MB的限制,所以我可以理解为什么我的资产没有缓存,但我宁愿它不会破坏服务资产。 我甚至不确定这个错误来自哪里。 大概来自其他一个机架中间件? 增加最大文件大小似乎没有任何影响。 config.cache_store = :dalli_store, ENV[“MEMCACHIER_SERVERS”].split(“,”), {¬ […]

Rails cache_digests触摸has_many关联

我有这样的事情: class Suite < ActiveRecord::Base has_many :tests end class Test < ActiveRecord::Base belongs_to :suite end 我正在使用cache_digests gem来进行片段缓存。 我希望在更新Suite对象时,子测试缓存过期。 我试图touch: true在has_many协会中没有成功。 我怎样才能做到这一点? 提前致谢 编辑 我这样做我的缓存: etc… etc.. 但它不起作用,因为当我编辑套件时,他们的测试没有被触及。 所以,我将缓存声明更改为: etc.. 它的效果与预期一致。 当我编辑测试或套件时,其中一个被触及,因此,片段已过期,我按预期获得了新版本。 感谢@ taryn-east的帮助。