Ruby on rails 铁轨坏了吗?
我正在使用活动资源将查询发送到外部API 为了避免滥用,结果会缓存一小时。以下是允许我缓存查询的代码: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
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字节。