ruby-on-rails – 使用RABL为JSON模板缓存变暖
好吧,在我得到实际问题之前,这篇文章有点罗嗦,因此删节版本基本上与使用RABL模板的缓存变暖有关.调用Rabl.render与API调用时,生成的缓存没有相同的缓存键.当直接使用Rabl.render时,我应该期望缓存键匹配,当通过API调用相同的模板时?
K,现在结束了…… 我在Heroku上有一个Rails API服务器.我使用俄语玩偶缓存对RABL进行了大量优化,以改善集合中底层对象的重用.虽然,我仍然留有收集缓存,当用户在第一次请求时生成时,是体验的负担(例如1秒api呼叫). 在调试示例API调用时,我在给定对象上获得以下缓存操作. … api / v1 / activities / 26600: Cache read: rabl/activities/26600-20140423170223588554000//hash/d30440d18014c72014a05319af0626f7 Cache generate: rabl/activities/26600-20140423170223588554000//hash/d30440d18014c72014a05319af0626f7 Cache write: rabl/activities/26600-20140423170223588554000//hash/d30440d18014c72014a05319af0626f7 所以对于调用… api / v1 / activities时的同一个对象(在上面的调用之后),我得到了所需的缓存命中: Cache read: rabl/activities/26600-20140423170223588554000//hash/d30440d18014c72014a05319af0626f7 Cache fetch_hit: rabl/activities/26600-20140423170223588554000//hash/d30440d18014c72014a05319af0626f7 这非常有效.下一步是避免让第一个/任何API调用花费时间来生成缓存. RABL提供了一种直接从代码渲染模板的方法(https://github.com/nesquena/rabl#rendering-templates-directly),这对于这个用例来说肯定是正确的方法.因此,我的目的是在API调用之前通过某个事件调用RABL引擎(例如 – 用户登录事件). 因此,对于上面的API示例,我将在rails控制台中调用以下内容并期望缓存命中. irb(main):002:0> @activity = Activity.find(26600) irb(main):003:0> Rabl.render(@activity,'api/v2/activities/show_no_root',:view_path => 'app/views',:format => :json) Cache read: rabl/activities/26600-20140423170223588554000//hash Cache generate: rabl/activities/26600-20140423170223588554000//hash Cache write: rabl/activities/26600-20140423170223588554000//hash 出乎意料的是,我没有得到缓存命中,但很明显缓存密钥不一样,因为缺少尾随哈希签名.我不确定为什么缓存密钥在这种情况下会有所不同.我无法为RABL模板加热缓存. UPDATE 结果是尾随缓存键中的哈希值是模板哈希值. Cache digest for api/v1/activities/_show.rabl: d30440d18014c72014a05319af0626f7 虽然这告诉我该哈希的来源,但仍然不清楚为什么直接调用Rabl :: Renderer也不会使用它. 解决方法
由于缓存键中缺少模板摘要哈希,我无法使用Rabl :: Render.但是通过创建一个sidekiq worker,如下所示,我可以通过调用api作为后台进程来加热缓存,这很好用.
class CacheWarmApi include Sidekiq::Worker sidekiq_options :queue => :warmers def perform( url_helper,args,params={},method='get') if method == 'get' session = ActionDispatch::Integration::Session.new(Rails.application) session.get(session.send(url_helper,*args),params) end end end 例如 : CacheWarmApi.perform_async( :api_v2_expensiveapi_url,args_array,params_hash) 我认为这有点过于沉重的解决方案,并且仍然认为Rabl :: Render有一个解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |