如何在memcache中保持记录的会话和清除除会话之外的缓存

new*_*ike 5 memcached ruby-on-rails amazon-web-services amazon-elb

在我的系统中,有很多web servers共享cache(memcache) server.

目前,它将清除每个新部署的memcache中的所有数据.

通过运行 rake memcached:flush

更重要的是,我可以user session在缓存服务器中看到,

但每当我关闭iPhone上的浏览器时,我需要一次又一次地重新登录(我必须弄错).

我建立了我的服务器的背面AWS ELBauto scaling

如何在ELB后面的每个服务器之间保持用户的会话

每次返回时都要将用户保持在记录状态.

缓存服务器

|       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              |
Run Code Online (Sandbox Code Playgroud)

confi/initialize/session.rb(我用Dalli和memcache保存缓存)

Rails.application.config.session_store :cookie_store, key: '_sampleA_session'
Rails.application.config.session_store ActionDispatch::Session::CacheStore, :expire_after => 6.month
Run Code Online (Sandbox Code Playgroud)

查看缓存/模型缓存

- cache("common_header", skip_digest: true) do
- cache("footer", skip_digest: true) do
...
Run Code Online (Sandbox Code Playgroud)

cache.rake(rake任务)

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
Run Code Online (Sandbox Code Playgroud)

production.rb

  config.action_controller.perform_caching = true
  config.cache_store = :dalli_store, ENV['MEMCACHE_DB'], { :pool_size => 10 ,compress: true }
Run Code Online (Sandbox Code Playgroud)

sma*_*ton 2

对于两个视图片段缓存,您可以执行以下操作(文档):

expire_fragment("common_header")
expire_fragment("footer")
Run Code Online (Sandbox Code Playgroud)

这将使缓存的片段无效,并因此更新您从该片段中的模型读取的值(因为片段被重新渲染)。如果这就是您对模型缓存的意思,那么您就可以开始了。如果你也想清除 SQL 查询缓存(虽然我不知道你为什么要这样做,因为 Rails 会自动使其失效),你可以参考这篇博客文章。