Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.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 围绕memcached';s Rails片段缓存中缺少通配符过期_Ruby On Rails_Memcached_Fragment Caching - Fatal编程技术网

Ruby on rails 围绕memcached';s Rails片段缓存中缺少通配符过期

Ruby on rails 围绕memcached';s Rails片段缓存中缺少通配符过期,ruby-on-rails,memcached,fragment-caching,Ruby On Rails,Memcached,Fragment Caching,我正在致力于将片段缓存添加到一个Rails 3站点,该站点既有登录用户也有匿名用户,并且需要根据整个站点显示的内容何时更新来控制页面部分何时过期。中途,我发现memcached不支持expire_片段的regexp,所以现在我正在寻找解决方法 对于匿名用户来说,这不是一个大问题。我创建诸如“frontpage新节目”或“schedule-weekly-forecast-10/24/10”之类的缓存键,并在制作节目模型中的新条目时,或在下周播出的节目通过“清理器”进行修改时使其过期。那很好用 我的

我正在致力于将片段缓存添加到一个Rails 3站点,该站点既有登录用户也有匿名用户,并且需要根据整个站点显示的内容何时更新来控制页面部分何时过期。中途,我发现memcached不支持expire_片段的regexp,所以现在我正在寻找解决方法

对于匿名用户来说,这不是一个大问题。我创建诸如“frontpage新节目”或“schedule-weekly-forecast-10/24/10”之类的缓存键,并在制作节目模型中的新条目时,或在下周播出的节目通过“清理器”进行修改时使其过期。那很好用

我的问题是登录的用户。他们每个人都有自己的定制时间表,所以我的密钥看起来像'schedule-user-jschuur-10/10/24',jschuur是帐户的用户名。我知道,使用基于日期的约定,它们会自然过期,但我还希望在当天(或一周)日程安排中的某些内容发生与显示相关的更改时,缓存日程安排的所有片段都会显式过期

事实证明,memcached无法完成我在这里需要的那种通配符过期(调度用户-.*-10/10/24)。这意味着我需要某种解决方案,将在memcached中的中心查找键中发出的所有键存储起来,或者让Rails/Ruby根据我发送给memcached的键在内部执行此操作

我认为前者是更好的解决方案。我的问题是,我如何以最有效的方式完成这项工作,这样我就不会浪费所有节省下来的时间,不再去打DB了。我可以在memcached中存储一个数组或散列,检索整个内容,在if上循环查找匹配项,删除它们并存储回散列。这听起来可能对几百甚至一千个用户都很有用,但这真的是最好的方法吗

是否有人已经解决了这个问题并发布了解决方案

一个要考虑的是,几乎所有的缓存都是用视图中的语句来完成的,它面向的是已经准备好的尚未被激活的查询,比如这个:

<% if current_user %>
  <% if current_user.saved_shows_count %>
    <% cache "schedule-user-#{current_user.username}-#{(Time.now + 3.hours).to_date.end_of_week.strftime('%D')}" do %>
      <% if @shows.any? %>
        <%= render :partial => "schedule/schedule", :locals => { :shows => @shows } %>
      <% end %>
    <% end %>
...

“时间表/时间表”,:locals=>{:shows=>@shows}%>
...

该网站托管在Heroku上,我使用dalli gem作为客户端。

编辑:正如dalli gem写的那样,这有一些问题,对我来说,读取会导致“封送数据太短”或“memcache中的封送数据无效”。我不确定这对你是否也有好处

尽管有点黑客,但您可以使用一个名称空间,然后增加名称空间,从而使使用它创建的所有键无效。为此,首先使用
Rails.cache.write(“frontpage new shows namespace”,“1”,{:raw=>true})在初始值设定项(或任何位置)中设置名称空间。设置每个缓存时,将
Rails.cache.read(“frontpage new shows namespace”)
添加到哈希键中,只要您愿意(在哪里并不重要)。使在名称空间中创建的所有缓存键过期就像
Rails.cache.increment(“frontpage new shows namespace”,1)
一样简单。您可能可以将
Rails.cache.read(“frontpage new shows namespace”)
添加为全局变量,从而消除创建缓存键的memcache搜索,然后在执行缓存命名空间增量时更新此变量


祝你好运,我希望这会有所帮助。

我花了几分钟在脑子里仔细思考,但现在我明白了。我可以设置在before:filter中读取当前名称空间ID,以查找那些缓存了内容的页面,这样我只在需要时查找它,使用它的代码更精简。”“过期”实际上只是memcached,现在只要它认为最旧的数据已经满了,它就会最终清除掉这些数据。我现在已经很好地工作了,即使是dalli。dalli github发行票据上有一条评论称,最近解决了封送处理数据的问题。谢谢你的帮助,威廉。