Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.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 铁轨坏了吗?_Ruby On Rails_Caching - Fatal编程技术网

Ruby on rails 铁轨坏了吗?

Ruby on rails 铁轨坏了吗?,ruby-on-rails,caching,Ruby On Rails,Caching,我正在使用活动资源将查询发送到外部API 为了避免滥用,结果会缓存一小时。以下是允许我缓存查询的代码: def find_with_read_through_cache(*arguments) logger.debug "----------------" logger.debug "arguments : #{arguments.join(' ')}" key = cache_key(arguments) logger.debug "ke

我正在使用活动资源将查询发送到外部API

为了避免滥用,结果会缓存一小时。以下是允许我缓存查询的代码:

    def find_with_read_through_cache(*arguments)
      logger.debug "----------------"
      logger.debug "arguments : #{arguments.join(' ')}"
      key = cache_key(arguments)
      logger.debug "key : #{key}"
      result = Rails.cache.read(key).try(:dup)
      logger.debug "result #{result}"
      logger.debug "#{key} #{result} #{self.cache_expires_in}"
      unless result
        result = find_without_read_through_cache(*arguments)
        logger.debug "write : #{Rails.cache.write(key, result, :expires_in => self.cache_expires_in)}"
      end
      result
    end
在第一个查询中,一切正常,我对每个查询都有200个请求,Rails.cache返回true:

----------------
arguments : players/ersykzer/
key : player/players/ersykzer/
result 
player/players/ersykzer/  3600
GET http://ws.maniaplanet.com:80/players/ersykzer/
--> 200 OK 109 (5376.3ms)
write : true
----------------
arguments : player/ersykzer/
key : canyonsolo/player/ersykzer/
result 
canyonsolo/player/ersykzer/  3600
GET http://ws.maniaplanet.com:80/canyon/rankings/solo/player/ersykzer/
--> 200 OK 115 (404.8ms)
write : true
----------------
arguments : player/ersykzer/
key : canyonmulti/player/ersykzer/
result 
canyonmulti/player/ersykzer/  3600
GET http://ws.maniaplanet.com:80/canyon/rankings/multiplayer/player/ersykzer/
--> 200 OK 169 (389.7ms)
write : true
----------------
arguments : zone/ {:params=>{:offset=>113, :length=>10}}
key : canyonsolo/zone//{:params=>{:offset=>113, :length=>10}}
result 
canyonsolo/zone//{:params=>{:offset=>113, :length=>10}}  3600
GET http://ws.maniaplanet.com:80/canyon/rankings/solo/zone/?length=10&offset=113
--> 200 OK 2012 (157.2ms)
write : true
----------------
arguments : zone/ {:params=>{:offset=>"2", :length=>10}}
key : canyonmulti/zone//{:params=>{:offset=>"2", :length=>10}}
result 
canyonmulti/zone//{:params=>{:offset=>"2", :length=>10}}  3600
GET http://ws.maniaplanet.com:80/canyon/rankings/multiplayer/zone/?length=10&offset=2
--> 200 OK 1849 (172.1ms)
write : true
但是,重新加载页面时,缓存中似乎有两个元素不可用:

----------------
arguments : players/ersykzer/
key : player/players/ersykzer/
result #<Player:0xaf25378>
player/players/ersykzer/ #<Player:0xaf25378> 3600
----------------
arguments : player/ersykzer/
key : canyonsolo/player/ersykzer/
result 
canyonsolo/player/ersykzer/  3600
GET http://ws.maniaplanet.com:80/canyon/rankings/solo/player/ersykzer/
--> 200 OK 115 (127.7ms)
write : true
----------------
arguments : player/ersykzer/
key : canyonmulti/player/ersykzer/
result 
canyonmulti/player/ersykzer/  3600
GET http://ws.maniaplanet.com:80/canyon/rankings/multiplayer/player/ersykzer/
--> 200 OK 169 (118.0ms)
write : true
----------------
arguments : zone/ {:params=>{:offset=>113, :length=>10}}
key : canyonsolo/zone//{:params=>{:offset=>113, :length=>10}}
result #<CanyonSolo:0xaee3180>
canyonsolo/zone//{:params=>{:offset=>113, :length=>10}} #<CanyonSolo:0xaee3180> 3600
----------------
arguments : zone/ {:params=>{:offset=>"2", :length=>10}}
key : canyonmulti/zone//{:params=>{:offset=>"2", :length=>10}}
result #<CanyonMulti:0xaeded10>
canyonmulti/zone//{:params=>{:offset=>"2", :length=>10}} #<CanyonMulti:0xaeded10> 3600
----------------
论点:玩家/易塞克斯/
键:玩家/玩家/易赛克/
结果#
游戏者/游戏者/埃塞克泽/#3600
----------------
参数:玩家/易塞克斯/
钥匙:canyonsolo/玩家/易塞克斯/
结果
canyonsolo/player/ersykzer/3600
得到http://ws.maniaplanet.com:80/canyon/rankings/solo/player/ersykzer/
-->200正常115(127.7毫秒)
写:对
----------------
参数:玩家/易塞克斯/
键:canyonmulti/player/ersykzer/
结果
canyonmulti/player/ersykzer/3600
得到http://ws.maniaplanet.com:80/canyon/rankings/multiplayer/player/ersykzer/
-->200正常169(118.0毫秒)
写:对
----------------
参数:zone/{:params=>{:offset=>113,:length=>10}
键:canyonsolo/zone/{:params=>{:offset=>113,:length=>10}
结果#
canyonsolo/zone/{:params=>{:offset=>113,:length=>10}}}3600
----------------
参数:zone/{:params=>{:offset=>“2”,:length=>10}
键:canyonmulti/zone/{:params=>{:offset=>“2”,“:length=>10}
结果#
canyonmulti/zone/{:params=>{:offset=>“2”,:length=>10}}
如您所见,两个元素
canyonsolo/player/ersykzer/
canyonmulti/player/ersykzer/
,尽管使用了相同的键,但缓存不会返回。
为什么它不起作用?(rails 3.1)

从rails 3.1升级到3.2.0后,它可以正常工作。我的代码中没有任何更改。这似乎是rails的一个bug。

您试图缓存的值是nil吗?不是,相反,它是一个大的XMLIt>1mb吗?您使用的是什么缓存存储?顺便说一下,与此相关的是Marshal.dump(object_to_be_cached)的大小。不,它很小,大约300字节。