Rails:从Active Record Session Store迁移到Redis Store

时间:2012-08-13 19:03:50

标签: ruby-on-rails session redis

我有一个大型应用程序,可以有多达数千个活动会话。我想使用this迁移到Redis会话商店。理想情况下,我希望我当前的会议保持活跃。

有没有人有迁移活动会话的经验。我假设我写了一个迁移或rake任务(我认为迁移,所以我可以删除旧表作为其中的一部分),我想写入redis所有当前的细节。

old_sessions = ActiveRecord::Base.connection.select_all("select * from sessions")
old_sessions.each { |session| $redis.set(????? ????) }

但我担心数据完整性。

1 个答案:

答案 0 :(得分:13)

好吧,经过一天的黑客攻击,这就是我想出的:

class MoveActiveRecordSesionsIntoRedis < ActiveRecord::Migration
  def up
    #get all the sessions from the last month
    old_sessions = ActiveRecord::Base.connection.select_all("select * from sessions where updated_at > '#{Time.now - 1.month}'")

    old_sessions.each do |session|


      #convert the base64 data back into the object
      data = ActiveRecord::SessionStore::Session.unmarshal(session["data"])

      #load each session into Redis, dumping the object appropriately      
      $redis.setex session["session_id"], 
                   1.month.to_i, 
                   Marshal.dump(data).to_s.force_encoding(Encoding::BINARY)
    end

    #drop the old session table (So long unecessary 3Gigs!)
    drop_table :sessions
  end

  def down
    raise ActiveRecord::IrreversibleMigration, "Session face-plant!"
  end
end

我在这里作为参考。或者,如果你看到它有问题,我全都听见了。