Ho un'app Rails 3.2 che sta servendo contenuti obsoleti. Uno scenario tipico:L'app Rails 3.2 sembra memorizzare nella cache le query tra le richieste?
- un admin aggiunge alcuni nuovi record nel back-end
- utente va a visualizzare la pagina di indice per quelle risorse
- che non appaiono sulla pagina
- hanno ricaricare; le risorse sono ora disponibili
- aggiornate; le risorse non sono lì
- ecc
ho creato un modello/regolatore/vista così ho potuto testare il tutto:
# app/models/cache_query_test.rb
class CacheQueryTest < ActiveRecord::Base
end
# app/controllers/cache_query_tests_controller.rb
class CacheQueryTestsController < ApplicationController
def count
@count = CacheQueryTest.count
@mysql_time = CacheQueryTest.find_by_sql("SELECT NOW() AS mysql_time")
respond_to do |wants|
wants.text { render :layout => false }
end
end
end
# app/views/cache_query_tests/count.text.erb
==============
Rails MySQL Time: <%= @mysql_time.first.mysql_time %>
Ruby Time: <%= Time.now.strftime "%Y-%m-%d %H:%M:%S" %>
Rails MySQL Count: <%= @count %>
Ho anche un piccolo script di shell in esecuzione che aggiunge periodicamente record alla tabella cache_query_tests nel database MySQL dell'app in modo che, in teoria, il database non stia interrogando la cache.
Quando mi ha colpito l'URL che visualizza la mia pagina di prova, ottengo un mix di risultati, come:
==============
Rails MySQL Time: Mon Sep 16 10:40:57 UTC 2013
Ruby Time: 2013-09-16 10:40:58
Rails MySQL Count: 177
o:
==============
Rails MySQL Time: Mon Sep 16 09:47:46 UTC 2013
Ruby Time: 2013-09-16 10:16:32
Rails MySQL Count: 165
o:
==============
Rails MySQL Time: Mon Sep 16 09:50:02 UTC 2013
Ruby Time: 2013-09-16 10:41:32
Rails MySQL Count: 167
e così via ...
In tutto ca ses, il "Ruby Time" è attuale e corretto, quindi la pagina stessa non viene memorizzata nella cache. Tuttavia, come puoi vedere, "Rails MySQL Time" spesso non è sincronizzato con Ruby Time. Inoltre, "Rails MySQL Count" è abbastanza spesso sbagliato, nonostante io aggiunga record al database, quindi questo è il motivo per cui penso che qualcosa all'interno dello stack di Rails stia eseguendo il caching delle query.
In base alle mie conoscenze, Rails deve solo eseguire query caching within a request. Qui, qualcosa (forse MySQL? Forse Rack? Forse Rails?) Lo sta facendo attraverso le richieste. Francamente, sono abbastanza perplesso su dove andare da qui. Mentre mi piacerebbe una soluzione :), mi piacerebbe anche qualche altra opinione su dove potrebbe trovarsi il problema.
Grazie.
In base alla [documentazione di caching di MySQL] (http://dev.mysql.com/doc/refman/5.6/en/query-cache-operation.html), MySQL non deve memorizzare le query nella cache con NOW () in essi, e si suppone che cancelli la cache quando i record sono INSERITI (come sto facendo). Comunque, ci provo io. Grazie. – Marc
Solo per dare seguito a quanto sopra, non ha funzionato :( – Marc