2013-03-12 16 views
5
select * from Foo where id = 200 

Come memorizzare nella cache l'oggetto di ricerca tramite ID, poiché osserviamo una chiamata selezionata eseguita continuamente su un determinato ID. Come dobbiamo abilitare questa in rotaie in modo non invadente, in modo da poter passare da un qualsiasi negozio di cache in futuro (dire memcached o Redis)Come trovare l'oggetto di ricerca della cache con ID

EDIT:

Molto simile a Hibernate strategia di cache basata org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE che viene applicato su tutte le classi Entity in Java EE.

+2

L'approccio di Rails al caching è leggermente diverso da quello di Hibernate. Potresti dare un'occhiata a http://guides.rubyonrails.org/caching_with_rails.html e http://broadcastingadam.com/2012/07/advanced_caching_revised/ per alcune buone visioni su come funziona. La mia comprensione della tua domanda è che vuoi evitare di dover afferrare un oggetto dal database su ogni richiesta - è giusto? Potrebbe esserti utile se pubblichi un po 'di codice in più. –

+0

Come dice Alex, qui non ci sono abbastanza informazioni. Cos'è questo select-by-id? Da dove proviene? Da quando si chiama Hibernate, caricare/caricare? Questo è in letargo? O rubino su rotaie? –

+0

@AlexGhiculescu Non voglio prendere un oggetto dal database su ogni richiesta dallo stesso id. – Joe

risposta

2

puoi semplici utilizzano guide di built-in di caching

Rails.cache.fetch :cache_id_here, :expires_in => 1.days do 
    Model.find(id) 
end 

Modifica :cache_id_here con tutto ciò che si desidera e impostare la scadenza alle proprie preferenze. Puoi usare questo caching con memcached o qualsiasi altro cache store che desideri. È sufficiente impostarlo nella configurazione dell'applicazione.

UPDATE

Sto lavorando a una gemma che risolve questo problema estendendo .find e metodi .save e caching dei risultati di Rail. È super beta e non è ancora stato testato in produzione, ma se sei disposto a provarlo, dai un'occhiata al repository: https://github.com/johnkoht/cache-money-millionaire e fammi sapere i tuoi pensieri.

In sostanza, se si chiama Post.find(3), verrà automaticamente trovata e creata una versione memorizzata nella cache con una chiave di cache di Post 3 che verrà automaticamente aggiornata al salvataggio o al tocco. Come ho detto, è beta ma risolve il problema.

+0

In che modo la tua gemma gestisce gli scenari di write-through? Inoltre, come è diversa la tua gemma da https://github.com/orslumen/record-cache? –

+0

@johnkoht proverà presto il tuo gioiello – Joe

1

seguito gemme forniscono funzionalità di cache write-through:

record-cache

Supporta Rails 3. attivamente sviluppato.

cache_money

Costruito da Twitter, ora mantenuto dalla comunità. Non so se supporta Rails 3.

3

nel modello Foo probabilmente si desidera qualcosa di simile

class Foo < ActiveRecord::Base 

    def self.find_some_foo(foo_id) 
    Rails.cache.fetch("foo_#{foo_id}", expires_in: 7.days) do 
     begin 
     self.where(:id => foo_id) 
     rescue Exception => e 
     logger.info "Exception fetching Foo ID: #{e.to_s}" 
     nil 
     end 
    end 
    end 

end 

Impostare archivio di cache di default dell'applicazione chiamando config.cache_store= dentro il file config/application.rb, ad esempio, config.cache_store = :memory_store Il link Alex Ghiculescu fornito collegamento ha una buona informazione in sezione 2.1.

L'archivio cache rails viene popolato automaticamente quando si tenta di recuperare una chiave che non esiste nello cache_store. Per questo motivo, è importante trovare una buona convenzione di denominazione per le tue chiavi. Una volta stabilite le nozioni di base, è facile passare da un archivio cache all'altro apportando la modifica appropriata in config/application.rb. Alcune delle opzioni disponibili sono memory store, file store, memcache o qualsiasi combinazione di cache store.

Per svuotare i binari nella cache di memoria, riavviare il server di rotaie. Per svuotare la cache dei file, digitare rake tmp:clear.Per scaricare memcache, vedere questo link.

+0

Suggerimento: #where restituisce una relazione, non un oggetto reale. Dovresti chiamare #prima su di esso. –

Problemi correlati