0

アクティブなリソースを使用して、外部APIにクエリを送信しています。

悪用を避けるために、結果は1時間キャッシュされます。これが私のクエリをキャッシュできるようにする私のコードです:

    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

ただし、ページがリロードされると、2つの要素がキャッシュで使用できないように見えます。

----------------
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

ご覧のとおり、2つの要素canyonsolo/player/ersykzer/canyonmulti/player/ersykzer/は、同じキーを使用していても、キャッシュから返されません。なぜ機能しないのですか?(レール3.1)

4

1 に答える 1

0

Rails 3.1 から 3.2.0 にアップグレードすると動作します。私のコードでは何も変更されていません。レールのバグのようです。

于 2012-07-05T12:21:47.200 に答える