2015-08-29 11 views
5

Nel mio sistema, ci sono molti web servers condividere uno cache(memcache) server.Come posso mantenere la sessione registrata e svuotare la cache tranne la sessione in memcache

Attualmente, cancellerà tutti i dati in memcache su ogni nuova distribuzione.

eseguendo rake memcached:flush

Cosa c'è di più, posso visto la user session nella cache server,

Ma ogni volta, quando chiudo il browser sul mio iPhone, ho bisogno di ri-login ancora e ancora (Devo ottenere qualcosa di sbagliato).

Ho impostato il mio server nella parte posteriore della AWS ELB e auto scaling

Come potrei tenere sessione gli utenti tra tutti i server dietro ELB

Per mantenere l'utente in stato di login ogni loro ritorna .

cache server

|  8 | 2016-03-01 10:07:59 +0000 |   291 | _session_id:08f1d7e8e82055367c44372d431b7f23    | 
|  8 | 2016-03-01 10:07:22 +0000 |   291 | _session_id:3553ad00c578b175d789f02dc696dd95    | 
|  8 | 2016-03-01 10:04:22 +0000 |   291 | _session_id:5cc2302455981a8a5d3cea98deb80acb    | 

confi/inizializzare/session.rb (li risparmio della cache con Dalli e memcache)

Rails.application.config.session_store :cookie_store, key: '_sampleA_session' 
Rails.application.config.session_store ActionDispatch::Session::CacheStore, :expire_after => 6.month 

vista cache/modello cache

- cache("common_header", skip_digest: true) do 
- cache("footer", skip_digest: true) do 
... 

cache. rake (rake task)

require 'socket' 
namespace :memcached do 
    desc 'Flushes whole memcached local instance' 
    task :flush do 
    server = ENV['MEMCACHE_DB'] 
    port = 11211 
    command = "flush_all\r\n" 
    socket = TCPSocket.new(server, port) 
    socket.write(command) 
    result = socket.recv(2) 
    if result != 'OK' 
     STDERR.puts "Error flushing memcached: #{result}" 
    end 
    socket.close 
    end 
end 

production.rb

config.action_controller.perform_caching = true 
    config.cache_store = :dalli_store, ENV['MEMCACHE_DB'], { :pool_size => 10 ,compress: true } 

risposta

2

Per i vostri due cache vista frammenti che si possono fare (docs):

expire_fragment("common_header") 
expire_fragment("footer") 

Questo dovrebbe invalidare il frammento di cache e quindi aggiornare i valori di leggere dal modello in questo frammento (dal momento che il frammento è rerenderizzato). Se questo è ciò che intendi con la cache dei modelli, sei a posto. Se si desidera cancellare anche la cache di query SQL (anche se non so perché si vorrebbe farlo, dal momento che Rails lo invalida automaticamente) è possibile fare riferimento al post del blog this.

+0

non ha funzionato se sposto cose memorizzate su memcache remoto :( – newBike

+0

Puoi essere più specifico? Ho un'app con un memecache remoto utilizzando quasi la stessa configurazione e le cache in scadenza con la meccanica delle guide funziona perfettamente bene –

+0

dopo aver eseguito il vostro comando la cache exsists ancora sul server di cache remota '| id | scade | byte | cache_key | | 4 | 2016/03/01 09:40:15 +0000 | 74 | _session_id: c388b2a5568dfd2917d0796b30154c68 | | 12 | 2015 -09-03 09:37:59 +0000 | 1070 | views/footer | | 13 | 2015-09-03 09:37:59 +0000 | 1163 | views/common_header | ' – newBike

Problemi correlati