Tag: memcached

Rails Cache Key生成为ActiveRecord :: Relation

我正在尝试生成一个片段缓存(使用Dalli / Memcached存储)但是密钥是使用“#”生成的,因为Rails似乎没有认识到存在缓存值并且正在命中数据库。 我在视图中的缓存键如下所示: cache([@jobs, “index”]) do 控制器有: @jobs = @current_tenant.active_jobs 使用这样的实际Active Record查询: def active_jobs self.jobs.where(“published = ? and expiration_date >= ?”, true, Date.today).order(“(featured and created_at > now() – interval ‘” + self.pinned_time_limit.to_s + ” days’) desc nulls last, created_at desc”) end 查看rails服务器,我看到缓存读取,但SQL查询仍然运行: Cache read: views/#/1-index Read fragment views/#/1-index (1.0ms) (0.6ms) SELECT COUNT(*) FROM “jobs” […]

当Memcachier达到缓存限制时,Heroku请求超时

我有一个使用Memcachier(Dalli作为客户端)部署到Heroku的Rails应用程序。 我正在使用免费的附加组件(它提供25 MB的缓存)。 我们开始接收来自heroku的请求超时,经过调试,我们发现手动刷新Memcachier解决了这个问题。 当Memcachier达到接近其限制的水平时发生超时,例如20 MB(当限制为25 MB时)。 为什么Memcachier不会随着时间的推移释放缓存空间? 是否有任何丢失的配置告诉Memcachier 在缓存达到一定大小时刷新 ? 我的conf: application.rb中 config.cache_store = :dalli_store production.rb client = Dalli::Client.new config.action_dispatch.rack_cache = { :metastore => client, :entitystore => client, :allow_reload => false }

使用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既不缓存原始响应头,也不设置适当的头本身。 结果是,即使结果(图像)没有改变,客户端每次都向服务器发出请求。 尽管该操作在缓存中受到快速响应时很快就会完成,但它仍然会再次发送所有数据,这是我想避免的。 如何让标题做正确的事情,以便客户端首先不发出请求,或者获得“未修改”的响应?

在Heroku上托管的网站的Twitter速率限制

我有一个使用自定义域在Heroku上托管的rails应用程序。 应用程序在每个页面的顶部显示单个用户的最新推文。 为了避免达到Twitter速率限制(150个请求p / h),我让应用程序在5分钟到期时将搜索结果缓存在memcache(Dalli)中。 这很好用,确保应用程序每小时只发出12个请求。 如果它被高度贩运,这个解决方案可能会有问题,但我觉得它很好。 尽管我远远低于速率限制,但我的网站会定期关闭并查看我的服务器日志,因为我已超出Twitter的速率限制。 这与Heroku有关吗? 还有什么可能导致它? 它与共享IP地址有关吗? 日志: 2012-02-20T22:09:52+00:00 app[web.1]: Rendered pages/home.html.erb within layouts/application (0.8ms) 2012-02-20T22:09:52+00:00 app[web.1]: Rendered layouts/_header.html.erb (336.2ms) 2012-02-20T22:09:52+00:00 app[web.1]: Completed 500 Internal Server Error in 339ms 2012-02-20T22:09:52+00:00 app[web.1]: ActionView::Template::Error (Rate limit exceeded. Clients may not make more than 150 requests per hour.): 2012-02-20T22:09:52+00:00 app[web.1]: 5: 2012-02-20T22:09:52+00:00 app[web.1]: 2012-02-20T22:09:52+00:00 […]

仅对单个模型使用缓存资金?

我想使用缓存钱,但我不想开始自动缓存一切(我正在使用大型生产应用程序,太字节数据等)。 如何仅将其用于我指定的模型? 现在我有: # initializers/cache_money.rb require ‘cache_money’ config = (cfg = YAML.load(IO.read(File.join(RAILS_ROOT, “config”, “memcached.yml”))))[RAILS_ENV] || cfg[“defaults”] $memcache = MemCache.new(config) $memcache.servers = config[‘servers’] $local = Cash::Local.new($memcache) $lock = Cash::Lock.new($memcache) $cache = Cash::Transactional.new($local, $lock) 然后在模型中我想用缓存钱缓存: # my_model.rb class MyModel $cache # … end 但这不起作用; 对is_cached的调用给出以下错误:NoMethodError:未定义的方法`create’for Config:Module 有任何想法吗? 如果不这样做,我可以在任何地方寻求缓存资金的帮助吗? 我找不到邮件列表或任何东西。

Rails操作缓存用户特定记录

我是一个铁杆新手试图为我的应用程序实现缓存。 我安装了memcached并在我的development.rb中配置它,如下所示: config.action_controller.perform_caching = true config.cache_store = :mem_cache_store 我有一个控制器ProductsController,它在登录时显示用户特定的产品。 class ProductsController false before_filter :require_user def index @user.products end end The route for index action is: /products 问题是,当我登录时 1)用户A第一次,rails命中我的控制器并缓存产品动作。 2)我注销并以用户B身份登录,它仍然以用户A身份登录并显示用户A而非用户B的产品。它甚至没有打到我的控制器。 关键可能是路由,在我的memcached控制台中,我看到它是基于相同的密钥获取的。 20 get views/localhost:3000/products 20 sending key views/localhost:3000/products 动作缓存不是我应该使用的吗? 我如何缓存和显示用户特定的产品? 谢谢你的帮助。

heroku / memcache和dalli的奇怪缓存问题

考虑以下。 从我的heroku控制台: >> Rails.cache.stats => {“server_id”=>{“evictions”=>”0”, “curr_items”=>”2064”, “total_items”=>”18793”, “bytes”=>”7674501”, … >> Rails.cache.clear => [true] >> Rails.cache.stats => {“server_id”=>{“evictions”=>”0”, “curr_items”=>”2064”, “total_items”=>”18793”, “bytes”=>”7674501”, 超级怪异 – 如何清除我的缓存!! 类似问题? : https : //stackoverflow.com/q/7122513/192791

如何使用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中缓存Model对象?

是否有一种技术可以在Rails中使用,这样每当在Model对象上执行简单的“查找”时,首先会在memcached中搜索结果,但只有在找不到结果时才会对数据库进行查询? 理想情况下,我希望解决方案是隐式的,这样我就可以编写Model.find(id),它首先检查缓存,如果需要数据库查询,则返回的对象被添加到缓存中,即我不要不需要用附加代码包装Model.find(id)来检查缓存是否匹配内容。 谢谢!